Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用MongoTemplate在MongoDB中的嵌套文档上应用GROUPBY?_Mongodb_Aggregation Framework_Spring Data Mongodb_Mongotemplate - Fatal编程技术网

如何使用MongoTemplate在MongoDB中的嵌套文档上应用GROUPBY?

如何使用MongoTemplate在MongoDB中的嵌套文档上应用GROUPBY?,mongodb,aggregation-framework,spring-data-mongodb,mongotemplate,Mongodb,Aggregation Framework,Spring Data Mongodb,Mongotemplate,查询工作正常,需要转换为mongo模板 样本文件: db.students.aggregate([ { $unwind: "$details" }, { $group: { _id: { sid: "$details.student._id", statuscode: "$details.studentStatus.statusCode" }, total: { $sum: 1 } } } ]);

查询工作正常,需要转换为mongo模板

样本文件:

db.students.aggregate([
  { $unwind: "$details" },
  {
    $group: {
      _id: {
        sid: "$details.student._id",
        statuscode: "$details.studentStatus.statusCode"
      },
      total: { $sum: 1 }
    }
  }
]);

给定聚合的Spring数据
MongoTemplate
代码如下所示

请注意,我在组之前添加了一个项目阶段。该项目是必需的;如果嵌套字段(“details.student.\u id”和“details.studentStatus.statusCode”)直接在group stage中使用,则会出现错误
“FieldPath字段名称可能不包含“”。”
,并且无法解析(只有在分组中使用多个字段时才会发生这种情况)

结果与您提供的聚合结果相同。我在Java8中使用了最新的Spring和MongoDB驱动程序

{
        "_id" : 59,
        "details" : [
                {
                        "student" : {
                                "_id" : "5d3145a8523a2e602e5e0200"
                        },
                        "studentStatus" : {
                                "statusCode" : 1
                        }
                }
        ]
}
MongoOperations mongoOps=newmongotemplate(MongoClients.create(),“spr_test”);
聚合agg=newAggregation(
放松(“细节”),
项目(“\u id”)
和(“详细信息.学生id”)。作为(“sid”)
和(“详细信息.学生状态.状态代码”)。作为(“状态代码”),
组(“sid”、“状态代码”)
.count().as(“总计”)
);
AggregationResults=mongoOps.aggregate(agg,“学生”,Document.class);
forEach(System.out::println);

请在帖子中提供一个JSON格式的示例文档。{“_id”:59,“详细信息”:[{“student”:{“_id”:“5d3145a8523a2e602e5e0200”,},“studentStatus”:{“statusCode”:1},}]},但是如果我想要Aggregation.ROOT(整个对象),project不允许我在这种情况下使用
$addFields
而不是
$project
——两者都是用于不同目的的投影阶段。默认情况下,addFields包含所有字段。
MongoOperations mongoOps = new MongoTemplate(MongoClients.create(), "spr_test");

Aggregation agg = newAggregation(
                                unwind("details"),    
                                project("_id")
                                    .and("details.student._id").as("sid")
                                    .and("details.studentStatus.statusCode").as("statuscode"),
                                group("sid", "statuscode")
                                    .count().as("total")
);

AggregationResults<Document> aggResults = mongoOps.aggregate(agg, "students", Document.class);
aggResults.forEach(System.out::println);