通过mongodb聚合中的$ max获取完整对象

TeT*_*TeT 1 mongodb aggregation-framework

我需要通过分组对象的集合masterIDid如果masterID不存在.在具有相同属性的一组对象中,masterID我需要找到具有最高pos属性($max: "$pos")的对象.但是,我很难获得pos最大化的完整对象,似乎通过聚合我只能得到pos属性,而不是整个对象.这是我使用的示例聚合,缺少$ifNullfor masterID:

> db.tst.aggregate([{ "$group": { "_id": "$masterID", "pos": { "$max": "$pos" } } }])
Run Code Online (Sandbox Code Playgroud)

示例对象将是:

> db.tst.find()
{ "_id" : ObjectId("547d6bd28e47d05a9a492e2e"), "masterID" : "master", "pos" : "453", "id" : "hallo" }
{ "_id" : ObjectId("547d6bda8e47d05a9a492e2f"), "masterID" : "master", "pos" : "147", "id" : "welt" }
{ "_id" : ObjectId("547d6be68e47d05a9a492e30"), "masterID" : "master2", "pos" : "1", "id" : "welt" }
Run Code Online (Sandbox Code Playgroud)

想要的聚合结果是:

{ "_id" : ObjectId("547d6bd28e47d05a9a492e2e"), "masterID" : "master", "pos" : "453", "id" : "hallo" }
{ "_id" : ObjectId("547d6be68e47d05a9a492e30"), "masterID" : "master2", "pos" : "1", "id" : "welt" }
Run Code Online (Sandbox Code Playgroud)

有没有办法通过聚合实现这个结果,还是我需要$push用来获取所有分组对象并pos在聚合周围的Java代码中实现最大化?

这个问题mongodb聚合:如何使用min/max而不是值返回一个对象,表明该对象应该被排序$first或者$last应该用于排序的对象pos,但是我看不到它是如何返回整个对象的.

wdb*_*ley 6

首先按pos降序排序.这样,每个文件遇到的第一个文件masterID是最高的文件pos.您可以使用它$$ROOT来引用管道中当前正在处理的整个文档.

db.tst.aggregate([
    { "$sort" : { "pos" : -1 } },
    { "$group": { 
        "_id": { $ifNull: [ "$masterID", "$_id" ] },
        "max_doc" : { "$first" : "$$ROOT" }
    } }
])
Run Code Online (Sandbox Code Playgroud)