我有以下类型的mongodb文件:
{
"_id" : {
"refId" : ObjectId("55e44dd70a975a6fec7ae66e"),
"someString" : "foo"
},
"someValue" : 1,
"date" : NumberLong("1441025536869"),
"subdoc" : {
"someRef" : ObjectId("xf2h55e44dd70a975a6fec7a"),
"count" : 99
}
}
想要获取具有最早"subdoc.someRef"
唯一"date"
的文档列表(如果有任何文档具有相同的"subdoc.someRef"
)并按任何字段排序。问题在于按字段"subdoc.count"
排序。
我使用以下spring数据聚合:
Aggregation agg = Aggregation.newAggregation(
Aggregation.match(match),
Aggregation.project("date", "someValue")
.and("subdoc.someRef").as("someRef")
.and("subdoc.count").as("count")
.and("_id.someString").as("someString")
.and("_id.refId").as("refId"),
Aggregation.sort(Sort.Direction.ASC, "date"),
Aggregation.group("someRef")
.min("date").as("date")
.first("refId").as("refId")
.first("someValue").as("someValue")
.first("count").as("count"),
Aggregation.project("someValue", "date", "refId", "count")
.and("_id").as("someRef"),
Aggregation.sort(pageable.getSort()),
Aggregation.skip(pageable.getOffset()),
Aggregation.limit(pageable.getPageSize())
);
除了弹簧数据如何转换外,其他方法都很好:.first(“count”)。as(“count”)
我总是在聚合结果中得到"count"
:null。
由spring创建的DBObject不是我所期望的。日志中的这一行关注我:
"$group" : { "_id" : "$someRef" , "date" : { "$min" : "$date"} , "refId" : { "$first" : "$_id.refId"} , "someValue" : { "$first" : "$someValue"} , "count" : { "$first" : "$subdoc.count"}}}
我无法理解为什么总是将"$subdoc.count"
放在"$count"
而不是将"$subdoc.count"
作为聚合传播管道的前一步的结果。因此,结果中的“count”始终为null,因为DROP TABLE #temp1
在最后一个grop步骤中始终为null。
如何使Spring使用我想要的值而不是引用?
答案 0 :(得分:0)
感谢评论,解决方案是消除预测并更新小组阶段。对子文档引用进行分组工作,这是我没想到的:
PPoint3d _ppoint1 = new Point3d(....);