如何使用MongoTemplate在MongoDB中的嵌套文档上应用GROUPBY?
查询工作正常,需要转换为mongo模板 样本文件:如何使用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 } } } ]);
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);