2017-05-28 10 views
1

ネストされたドキュメントのクエリに関する質問があります。私は検索しようとしましたが、私の質問に何も答えなかったか、あるいは私はそれを見落としていました。すべてのドキュメントから配列のネストされたドキュメントを返す方法

{ 
    "_id" : ObjectId("592aa441e0f8de09b0912fe9"), 
    "name" : "Patrick Rothfuss", 
    "books" : [ 
    { 
     "title" : "Name of the wind", 
     "pages" : 400, 
     "_id" : ObjectId("592aa441e0f8de09b0912fea") 
    }, 
    { 
     "title" : "Wise Man's Fear", 
     "pages" : 500, 
     "_id" : ObjectId("592aa441e0f8de09b0912feb") 
    }, 
    }, 
    { 
    "_id" : ObjectId("592aa441e0f8de09b0912fe9"), 
    "name" : "Rober Jordan", 
    "books" : [ 
    { 
     "title" : "The Eye of the World", 
     "pages" : 400, 
     "_id" : ObjectId("592aa441e0f8de09b0912fea") 
    }, 
    { 
     "title" : "The Great Hunt", 
     "pages" : 500, 
     "_id" : ObjectId("592aa441e0f8de09b0912feb") 
    } 
    }, 

そして、私は著者の全体colletion内のすべてのブックの一覧を照会したい - のようなもの:私はこのような構造を持っている

"books" : [ 
    { 
     "title" : "The Eye of the World", 
     "pages" : 400, 
     "_id" : ObjectId("592aa441e0f8de09b0912fea") 
    }, 
    { 
     "title" : "The Great Hunt", 
     "pages" : 500, 
     "_id" : ObjectId("592aa441e0f8de09b0912feb") 
    }, 
    { 
     "title" : "Name of the wind", 
     "pages" : 400, 
     "_id" : ObjectId("592aa441e0f8de09b0912fea") 
    }, 
    { 
     "title" : "Wise Man's Fear", 
     "pages" : 500, 
     "_id" : ObjectId("592aa441e0f8de09b0912fea") 
    }] 
+0

あなたはここで正確に何を求めていますか?配列からすべての埋め込みドキュメントを "抽出"して単純にそれらの結果を返すのはどうですか?ここで「同名」とは何を意味していますか? –

+0

同じ名前ですね - **本**? DBコレクション内のすべての**本**のリストを抽出します。それをより良く表現する方法を知らなかった。 – LadaWalker

答えて

0

あなたは.aggregate()を使用してこれを行うことができますをし、主に$unwindパイプライン演算子:

あなたは$replaceRoot

と並行して使用することができます現代のMongoDB 3.4では、上
Model.aggregate([ 
    { "$unwind": "$books" }, 
    { "$replaceRoot": { "newRoot": "$books" } } 
],function(err,results) { 

}) 

以前のバージョンでは、$projectですべてのフィールドを指定します。

Model.aggregate([ 
    { "$unwind": "$books" }, 
    { "$project": { 
    "_id": "$books._id", 
    "pages": "$books.pages", 
    "title": "$books.title" 
    }} 
],function(err,results) { 

}) 

だから $unwindはあなたが解体または「denormalise」処理のための配列エントリに使用するものです。実際には、配列の各メンバーのドキュメント全体のコピーが作成されます。

残りのタスクは、配列に存在するフィールドのみを返すことです。

これは非常に賢明なことではありません。ドキュメントの配列内に埋め込まれたコンテンツのみを返すようにする場合は、そのコンテンツを別のコレクションに入れる方がよいでしょう。

集約フレームワークを使用してコレクションからすべてのドキュメントを分離し、アレイからのそれらのドキュメントのみを一覧表示することは、パフォーマンスがはるかに優れています。

+0

ニース、それはまさに私が意味していたものです。ありがとうございました。 – LadaWalker

0

上記の説明に従って、MongoDBシェルで次のクエリを実行してみてください。

db.collection.aggregate(

    // Pipeline 
    [ 
     // Stage 1 
     { 
      $unwind: "$books" 
     }, 

     // Stage 2 
     { 
      $group: { 
       _id:null, 
       books:{$addToSet:'$books'} 
      } 
     }, 

     // Stage 3 
     { 
      $project: { 
       books:1, 
       _id:0 
      } 
     }, 

    ] 

); 
関連する問題