2016-07-27 10 views
0

私は、結合についての情報と、それらがどのようにしてMongoDB内で動作するかを探しています。 NoSQLデータベースの背後にある大量の機能は、文書内のすべての情報を保存することであり、その文書にはできるだけ多くの情報を格納して複数のクエリを実行する必要がないことに感謝します。MongoDB:コレクションを1つの文書に結合する

一貫性の問題のリスクを最小限に抑えるために、データの重複を最小限に抑えたいシナリオがいくつかあることに感謝します。

ドキュメント参照を使用する場合、単一のドキュメントを返す方法はありますか?私は$lookup関数を試してみましたが、適切な結果を返す一方、すべての配列エントリに対して1つのドキュメントを返します。

お客様:

{ 
    _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つの文書、顧客と各注文の1の結果を得ることができますデータが追加されましたが、配列情報または注文情報を持つ単一のドキュメント(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を実行してその結果を得ることができます。モンゴの一部は$lookupドキュメントのhow to lookup with an arrayを示しています。次のコレクションを考える

  • $unwind新しく01を作成した_idフィールド上

    order収集のためのあなたのorders配列
  • $lookup
    • $unwind

      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を実行します含むフィールドは_idによってアイテムに

    • $groupを見上げると

    集計クエリを複製することなく、1つのアレイ内のあなたの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"] 
        }] 
    } 
    
  • 関連する問題