代码之家  ›  专栏  ›  技术社区  ›  Saurabh Kumar

Spring数据mongo按两个字段的值差过滤

  •  0
  • Saurabh Kumar  · 技术社区  · 5 年前

    我有如下文件

    Document {
       BigDecimal originalPrice
       BigDecimal discounPrice
    }
    

    现在我想得到结果 [originalPrice - discountPrice] 以分页的方式从最大差异到最小差异。

    有没有一种方法可以使用SpringDataMongoDB来实现这一点,而不必在第三个字段中保存差异,而只需查询第三列?

    更新:

    基于@HbnKing的回答,我使用SpringDataMongoDB尝试了下面的操作,但是现在我得到了一个错误

    ProjectionOperation projectionOperation = project("originalPrice", "discountPrice").and(Subtract.valueOf("originalPrice")
                    .subtract("discountPrice"))
                    .as("diff");
    SortOperation sortOperation = sort(new Sort(Direction.DESC, "diff"));
    
    TypedAggregation<ProductVariantModel> aggregation = Aggregation
                    .newAggregation(ProductVariantModel.class, projectionOperation, sortOperation, skip((long) pageable.getOffset()), limit((long) pageable.getPageSize()));
    

    错误:

    命令失败,错误为16556(Location16556):'cant$subtract 从服务器上的字符串收敛

    0 回复  |  直到 5 年前
        1
  •  1
  •   HbnKing    5 年前

    对。你可以用 $subtract 然后用你的数据计算差异 $sort

    在mongo shell中看起来是这样的

    Enterprise repl2:PRIMARY> db.wang.aggregate([{ $project: { a: 1, b:1, differ: { $subtract: [ "$a", "$b" ] } } },{$sort :{differ:-1}} ] )
    { "_id" : ObjectId("5d494045fd02abc31f622366"), "a" : 100, "b" : 30, "differ" : 70 }
    { "_id" : ObjectId("5d494062fd02abc31f622368"), "a" : 13, "b" : 7, "differ" : 6 }
    { "_id" : ObjectId("5d49406afd02abc31f622369"), "a" : 13, "b" : 9, "differ" : 4 }
    { "_id" : ObjectId("5d494058fd02abc31f622367"), "a" : 10, "b" : 7, "differ" : 3 }
    MongoDB Enterprise repl2:PRIMARY> db.wang.find()  
    { "_id" : ObjectId("5d494045fd02abc31f622366"), "a" : 100, "b" : 30 }
    { "_id" : ObjectId("5d494058fd02abc31f622367"), "a" : 10, "b" : 7 }
    { "_id" : ObjectId("5d494062fd02abc31f622368"), "a" : 13, "b" : 7 }
    { "_id" : ObjectId("5d49406afd02abc31f622369"), "a" : 13, "b" : 9 }
    MongoDB Enterprise repl2:PRIMARY>
    

    稍后我会给你一个java演示
    编辑

     AggregateIterable<Document> aggregate = collection.aggregate(Arrays.asList(Aggregates.project(fields(include("a", "b"),
                    new BasicDBObject("differ",new BasicDBObject("$subtract",Arrays.asList("$a","$b"))))),
                    Aggregates.sort(new BasicDBObject("differ",-1)),
                    Aggregates.project(fields(include("a","b")))));
            MongoCursor<Document> iterator = aggregate.iterator();
            while (iterator.hasNext()){
                System.out.println(iterator.next());
            }
    

    为错误编辑

    在字段前面加上 $ 使用时 Subtract .

    Subtract.valueOf("$originalPrice")
                    .subtract("$discountPrice"))
                    .as("diff");
    

    你最好把你的 spring-data-mongodb 版本