0

請幫我解決一下mongoDB彙總問題。以下是我想要做的下一步:關於大數據的Mongo彙總框架

我有收藏A。從A一個文檔表示喜歡的對象:

{ 
    nameA: 'first', 
    items: [ 
    'item1', 
    'item2', 
    'item3', 
    'item4' 
    ] 
} 

和我有收藏B有像證件:

[ 
    { 
     item: 'item3', 
     info: 'info1' 
    }, 
    { 
     item: 'item3', 
     info: 'info2' 
    }, 
    { 
     item: 'item3', 
     info: 'info3' 
    } 
] 

我與大數據工作,所以這將是更好地做一個查詢。試想一下,我們已經從集合A中的所有數據,我想建立在集合B中的查詢來獲取一個結構的結果:

{ 
    'first'/*nameA*/: ['info1', 'info2', 'info3'], 
    .... 
} 

如何實現與MongoDB的聚集所期望的結果?

+0

這是不是非常有幫助的設計,注意蒙戈不允許加入,有$查詢像左連接一樣操作,您可以在彙總管道中查看$ lookup的文檔。 –

回答

1

正如Rahul Kumar在他的評論中提到的那樣,您的設計更傾向於關係數據庫模式設計,並且這使得設計高效的MongoDB變得相當困難。

但是,它仍然是可能實現你通過利用聚合框架的$lookup階段需要的功能,如下:

db.A.aggregate([ 
    { 
     $unwind: { 
      path: "$items" 
     } 
    }, 
    { 
     $lookup: { 
      from: "B", 
      localField: "items", 
      foreignField: "item", 
      as: "item_info" 
     } 
    }, 

    { 
     $unwind: { 
      path: "$item_info" 
     } 
    }, 

    { 
     $group: { 
      _id: "$nameA", 
      item_info: { $addToSet: "$item_info.info" } 
     } 
    } 
]); 
  1. 在第一$unwind階段,你規範化items排列在 collection A爲了能夠通過它的輸出到下一個 階段

  2. 在th然後左轉ê$lookup階段兩個集合 屬於同一數據庫的一部分之間的連接,在這種情況下,用來從collection B

  3. 的 項目信息在您標準化您從中提取 數據中的第二$unwind階段collection B以便弄平含有從collection B的 對象被映射到相應的 項陣列中collection A

  4. 最後,在階段$group你組中的所有通過nameA設置 結果集的條目,並創建一組唯一的項目信息 值。如果您希望所有重複出現的商品信息值爲 ,則可以用$push代替累加器中的$addToSet

下面是運行,您所提供的藏品上述聚合管道的結果:

{ "_id" : "second", "item_info" : [ "info3", "info2", "info1" ] } 
{ "_id" : "first", "item_info" : [ "info3", "info2", "info1" ] } 
+0

是的:)我知道使用關係數據庫模式設計會更好,但它已經寫好了。非常感謝您的幫助!非常感謝你! –