0

我有以下类型的 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"。我使用以下弹簧数据聚合:

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"在最后一个 grop 步骤中始终为空。如何让 Spring 使用我想要的值而不是引用?

4

1 回答 1

0

感谢评论,解决方案是消除预测和更新小组赛阶段。分组与子文档引用配合得很好,这是我没想到的:

    Aggregation agg = Aggregation.newAggregation(
            Aggregation.match(match),
            Aggregation.sort(Sort.Direction.ASC, "date"),
            Aggregation.group("subdoc.someRef")
                    .first("subdoc.count").as("count")
                    .first("_id.refId").as("refId")
                    .first("_id.someString").as("someString")
                    .first("date").as("date")
                    .first("someValue").as("someValue"),
            Aggregation.sort(pageable.getSort()),
            Aggregation.skip(pageable.getOffset()),
            Aggregation.limit(pageable.getPageSize())
    );
于 2016-03-15T13:02:59.400 回答