将mongodb的聚合查询转换为spring boot

kyvafyod  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(419)

我有一个mongodb查询,可以正常工作

db.user.aggregate([
  {
    "$project": {
      "data": {
        "$objectToArray": "$$ROOT"
      }
    }
  },
  {
    $unwind: "$data"
  },
  {
    "$match": {
      "data.v": {
        $regex: "Mohit Chandani"
      }
    }
  }
])

基本上,获取所有具有mohit chandani值的文档,下面是输出:

{ "_id" : "b387d728-1feb-45b6-bdec-dafdf22685e2", "data" : { "k" : "fullName", "v" : "Mohit Chandani" } }
{ "_id" : "8e35c497-4296-4ad9-8af6-9187dc0344f7", "data" : { "k" : "fullName", "v" : "Mohit Chandani" } }
{ "_id" : "c38b6767-6665-46b8-bd29-645c41d03850", "data" : { "k" : "fullName", "v" : "Mohit Chandani" } }

我需要这个查询转换为我的spring启动应用程序,我正在编写following:-

Aggregation aggregation = Aggregation.newAggregation(Aggregation.project(Aggregation.ROOT), Aggregation.match(Criteria.where(connectionRequest.getWord())));

在spring数据中进行长聚合时,了解采用哪种方法会很有帮助。

slhcrj9b

slhcrj9b1#

这可能会帮助你,希望你正在使用 MongoTemplate 用于聚合。

@Autowired
private MongoTemplate mongoTemplate;

上面脚本的代码是

public List<Object> test() {

    Aggregation.newAggregation(
        project().and(ObjectOperators.valueOf(ROOT).toArray()).as("data"),
        unwind("data"),
        match(Criteria.where("data.v").regex("Mohit Chandani")
        )
    ).withOptions(AggregationOptions.builder().allowDiskUse(Boolean.TRUE).build());

    return mongoTemplate.aggregate(aggregation, mongoTemplate.getCollectionName(YOUR_COLLECTION.class), Object.class).getMappedResults();

}

我不确定 project() 上面的代码都可以,因为我还没试过。我从SpringDataMongoDB中引用了它
如果它不起作用,这肯定会起作用。在Spring Data 中很少有操作不受支持,例如 $addFields , $filter .. 所以我们做了个小把戏

public List<Object> test() {

    Aggregation aggregation = Aggregation.newAggregation(

        p-> new Document("$project",
                new Document("data",
                    new Document("$objectToArray","$$ROOT")
                )     
            ),
        unwind("data"),
        match(Criteria.where("data.v").regex("Mohit Chandani"))     

    ).withOptions(AggregationOptions.builder().allowDiskUse(Boolean.TRUE).build());

    return mongoTemplate.aggregate(aggregation, mongoTemplate.getCollectionName(YOUR_COLLECTION.class), Object.class).getMappedResults();

}

相关问题