我在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 –