2016-07-27 61 views
0

我正在查找關於連接的一些信息以及它們在MongoDB內的行爲。雖然我認識到NoSQL數據庫背後的大量力量是將所有信息存儲在文檔中,並且該文檔包含儘可能多的信息以便您不必執行多個查詢MongoDB:將集合加入到單個文檔中

但是我也請注意,有些情況下您可能希望儘量減少數據重複,以便將一致性問題的風險降至最低。

當使用文檔引用時,有什麼辦法可以返回單個文檔嗎?我嘗試過$lookup函數,雖然它返回了正確的結果,但它爲每個數組條目返回一個文檔。

假設以下結構:

客戶:

{ 
    _id: ObjectId("578d706916f07969c4b0cad1"), 
    name: "fred", 
    orders: [ObjectId("578d706916f07969c4b0cad2"),ObjectId("578d706916f07969c4b0cad3")] 
} 

訂單:

{ 
    _id: ObjectId("578d706916f07969c4b0cad2"), 
    date: xxxx, 
    items: [a,b,c,d] 
}, 
{ 
    _id: ObjectId("578d706916f07969c4b0cad2"), 
    date: xxxx, 
    items: [x,y,z] 
} 

使用查找,我可以得到2個文件,一個是與客戶的每個訂單的結果數據附加,但是我正在尋找一個數組或訂單信息的單個文檔 - embedded document。即以下結構

{ 
    _id: ObjectId("578d706916f07969c4b0cad1"), 
    name: "fred", 
    orders: [ 
     { 
      _id: ObjectId("578d706916f07969c4b0cad2"), 
      date: xxxx, 
      items: [a,b,c,d] 
     }, 
     { 
      _id: ObjectId("578d706916f07969c4b0cad2"), 
      date: xxxx, 
      items: [x,y,z] 
     }] 
} 

這是可能的在MongoDB?或者是join流程與SQL數據庫緊密匹配,您將在嘗試連接數據時始終返回重複的客戶信息?我知道數據可以在應用程序中變成單個文檔,例如node然而,從查詢寫入的方式來說,它可能會將其預格式化?

回答

1

您可以執行一個單獨的aggregation來獲得該結果。 mongo的一部分$lookup文檔顯示how to lookup with an array

鑑於以下集合:

db.user.insert({ 
    name: "fred", 
    orders: [ObjectId("578d706916f07969c4b0cad2"),ObjectId("578d706916f07969c4b0cad3")] 
}) 
db.order.insert({ 
    _id: ObjectId("578d706916f07969c4b0cad2"), 
    date: ISODate("2012-12-20T06:01:17.171Z"), 
    items: ["a","b","c","d"] 
}) 

db.order.insert({ 
    _id: ObjectId("578d706916f07969c4b0cad3"), 
    date: ISODate("2012-12-19T06:01:17.171Z"), 
    items: ["x","y","z"] 
}) 

執行aggregation有:

  • orders陣列的$unwind
  • $lookuporder收集上_id
  • $unwind新建01含有看着場最多的項目
  • $group通過_id和重新組合在單個陣列中的orders項目,而不重複

聚集查詢:

db.user.aggregate([{ 
    $unwind: "$orders" 
}, { 
    $lookup: { 
     from: "order", 
     localField: "orders", 
     foreignField: "_id", 
     as: "orders" 
    } 
}, { 
    $unwind: "$orders" 
}, { 
    $group: { 
     _id: "$_id", 
     name: { 
      $first: "$name" 
     }, 
     orders: { 
      $addToSet: "$orders" 
     } 
    } 
}]) 

這會給你:

{ 
    "_id": ObjectId("5798a8e1968539bb0a98d1c3"), 
    "name": "fred", 
    "orders": [{ 
     "_id": ObjectId("578d706916f07969c4b0cad3"), 
     "date": ISODate("2012-12-19T06:01:17.171Z"), 
     "items": ["x", "y", "z"] 
    }, { 
     "_id": ObjectId("578d706916f07969c4b0cad2"), 
     "date": ISODate("2012-12-20T06:01:17.171Z"), 
     "items": ["a", "b", "c", "d"] 
    }] 
} 
相關問題