我在MongoDB中有以下情形:
每条记录都有它自己的_id和一个parentId。如果parentId ==“”那么它是一个真正的父记录。如果parentId有一个值,那么该记录实际上是一个指向父记录的孩子。以下显示一位父母及其关联的孩子。
{"_id": ObjectId('586c9d275d2f62e1634978db'), parentId="", count=1, <other fields>}
{"_id": ObjectId('586c9d275d2f62e163497811'), parentId=ObjectId('586c9d275d2f62e1634978db'), count=3, <other fields>}
我想查询的地方,我觉得所有的数场,所有的父母和孩子的记录组合在一起排序的父记录。例如,最简单的通过图来说明:
ID6具有被关联到父ID5的最高计数值。接下来的最高计数是关联于母公司ID1 ID2终于ID4是父母,也应该归还所以结果应该是:
ID5,ID1,ID4
HoefMeistert帮我想出了以下查询:
db.collection.aggregate(
[
{
$project: {
group_id : { $cond : { if: { $ne: [ "$parentId", "" ] }, then: "$parentId", else: "$_id" }},
count :1,
field1:1,
field2:1
}
},
{
$group: {
_id : "$group_id",
highest : { $max: "$count" }
},
"field1":{"$first":"$field1"},
"field2":{"$first":"$field2"},
},
{
$sort: {
highest : -1
}
}
]
);
与此查询的问题是,它不返回相关联的父母即在FIELD1和FIELD2图中的ID1和ID5。有没有一种方法可以在小组阶段投射与父母相关的正确字段?否则,如果小组赛阶段返回如下内容:
{'_id': ObjectId('586c9d275d2f62e1634978db'), 'highest': 2}
{'_id': ObjectId('586c9d0d5d2f62e1634978d5'), 'highest': 1}
{'_id': ObjectId('586c9d365d2f62e1634978e3'), 'highest': 0}
如何重新组合后拉回所有上述ID的整个记录?即586c9d275d2f62e1634978db,586c9d0d5d2f62e1634978d5,586c9d365d2f62e1634978e3 ??
不介意使用MongoDB的从3.4 –