2017-01-04 61 views
2

我在MongoDB中有以下情形:

每條記錄​​都有它自己的_id和一個parentId。如果parentId ==「」那麼它是一個真正的父記錄。如果parentId有一個值,那麼該記錄實際上是一個指向父記錄的孩子。以下顯示一位父母及其關聯的孩子。

{"_id": ObjectId('586c9d275d2f62e1634978db'), parentId="", count=1, <other fields>} 
{"_id": ObjectId('586c9d275d2f62e163497811'), parentId=ObjectId('586c9d275d2f62e1634978db'), count=3, <other fields>} 

我想查詢的地方,我覺得所有的數場,所有的父母和孩子的記錄組合在一起排序的父記錄。例如,最簡單的通過圖來說明:

enter image description here

ID6具有被關聯到父ID5的最高計數值。接下來的最高計數是關聯於母公司ID1 ID2終於ID4是父母,也應該歸還所以結果應該是:

ID5,ID1,ID4

HoefMeistert幫我想出了以下查詢:

MongoDB sorting on children

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 ??

+0

不介意使用MongoDB的從3.4 –

回答

1

您的查詢有錯誤,field1field2需要是$group字典裏:根據你的圖上

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 
     } 
    } 
]); 

結果:

{ "_id" : "5", "highest" : 5, "field1" : ..., "field2" : ... } 
{ "_id" : "1", "highest" : 3, "field1" : ..., "field2" : ... } 
{ "_id" : "4", "highest" : 1, "field1" : ..., "field2" : ... } 

編輯:

db.collection.aggregate([ 
    { 
     $project: { 
      group_id: { $cond: { if: { $ne: [ "$parentId", "" ] }, then: "$parentId", else: "$_id" }}, 
      count: 1, 
      field1: { $cond: { if: { $ne: [ "$parentId", "" ] }, then: null, else: "$field1" }}, 
      field2: { $cond: { if: { $ne: [ "$parentId", "" ] }, then: null, else: "$field2" }}, 
     } 
    }, 
    { 
     $group: { 
      _id: "$group_id", 
      highest: { $max: "$count"}, 
      field1: { "$max": "$field1"}, 
      field2: { "$max":"$field2"}, 
     }, 
    }, 
    { 
     $sort: { 
      highest : -1 
     } 
    } 
]);

有了這個編輯,在小組階段只有父母將具有值爲field1,field2,其他文件將具有null值。比我們可以做一個$max他們,以獲得唯一的價值,父母的價值。

結果就會像上面一樣,和field1field2將有從母文件值

+0

的Sergiu嗨功能,感謝指出了這一點,這是一個錯字原代碼在裏面包含它們。然而這不是問題。投射的領域仍然可能不屬於父母 –

+0

我看,讓我們嘗試改進,檢查我的編輯 – sergiuz

+0

尼斯是的,看起來像它會工作謝謝Sergiu。之前我接受這個答案,雖然我只是看着graphLookup功能,我認爲可能會提供更優雅的解決方案。 –