TeT*_*TeT 1 mongodb aggregation-framework
我需要通过分组对象的集合masterID或id如果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,但是我看不到它是如何返回整个对象的.
首先按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)
| 归档时间: |
|
| 查看次数: |
1180 次 |
| 最近记录: |