2017-07-11 7 views
0

データベースから単一のオブジェクト階層全体をJSONとして取得する必要があります。 私は何時間も集計しようとしていますが、データでそれを行う方法を解決することはできません。私は再する必要が3つの子レベルを持つMongoDBのネストされた参照

フォーム

{ "_id" : "1", "name" : "My first form" } 
{ "_id" : "2", "name" : "Second one" } 
{ "_id" : "3", "name" : "Another" } 

質問

{ "_id" : "q1", "form" : "1", "title": "What's your country?"} 
{ "_id" : "q2", "form" : "1", "title": "What your favorite color?"} 
{ "_id" : "q3", "form" : "1", "title": "Where do you live?"} 
{ "_id" : "q4", "form" : "2", "title": "Where to go?"} 

オプション

{ "_id" : "o1", "question" : "q1", "text" : "Brazil" } 
{ "_id" : "o2", "question" : "q1", "text" : "EUA" } 
{ "_id" : "o3", "question" : "q1", "text" : "China" } 
{ "_id" : "o4", "question" : "q2", "text" : "Red" } 
{ "_id" : "o5", "question" : "q2", "text" : "Blue" } 
{ "_id" : "o6", "question" : "q2", "text" : "Green" } 

:だから私は3つのコレクションを持っていますそれぞれのフォームにすべての対応する質問をつけ、それぞれの質問にはオプションをつけてください。このように:

[ 
    { 
     _id:"q1", 
     name: "My first form", 
     questions: [ 
      { "_id" : "q1", 
      "form" : "1", 
      "title": "What's your country?", 
      "options": [ 
        { "_id" : "o1", "question" : "q1", "text" : "Brazil" } 
        { "_id" : "o2", "question" : "q1", "text" : "EUA" }, 
        { "_id" : "o3", "question" : "q1", "text" : "China" } 
      ] 
      }, 
      { "_id" : "q2", 
      "form" : "1", 
      "title": "What your favorite color", 
      "options": [ 
        { "_id" : "o4", "question" : "q2", "text" : "Red" } 
        { "_id" : "o5", "question" : "q2", "text" : "Blue" }, 
        { "_id" : "o6", "question" : "q2", "text" : "Green" } 
      ] 
      }, 
      { "_id" : "q3", 
      "form" : "1", 
      "title": "Where do you live?", 
      "options": [] 
      } 
     ] 
    }, 
    ... 
] 

私は$検索、$巻き戻し、別の$検索と$プロジェクトの多くを試してみたが、何も与えない、私にその結果(内部の質問でフォーム、内部のオプション付きの質問)。

は、私を助けてください! :)

答えて

1

questionコレクションを照会し、questionを検索し、formでグルーピングし、最後にルックアップフォームとプロジェクトをこの順に実行していると思います。

これはそれを行う必要があります。この集計の出力にある_idは、_idの形式であることに注意してください。

db.question.aggregate([ 
    {$match: {}}, 
    {$lookup: { 
     from: 'option', 
     localField: '_id', 
     foreignField: 'question', 
     as: 'options' 
    }}, 
    {$group: { 
     _id: "$form", 
     questions: {$push: { 
      title: "$title", 
      options: "$options", 
      form: "$form" 
     }} 
    }}, 
    {$lookup: { 
     from: 'form', 
     localField: "_id", 
     foreignField: "_id", 
     as: 'form' 
    }}, 
    {$project: { 
     name: {$arrayElemAt: ["$form.name", 0]}, 
     questions: true 
    }} 
]); 

実際、これはもっと良い選択肢のようです。 も含まないformを返します。

db.form.aggregate([ 
    {$match: {}}, 
    {$lookup: { 
     from: 'question', 
     localField: '_id', 
     foreignField: 'form', 
     as: 'questions' 
    }}, 
    {$unwind: { 
     path: "$questions", 
     preserveNullAndEmptyArrays: true 
    }}, 
    {$lookup: { 
     from: 'option', 
     localField: 'questions._id', 
     foreignField: 'question', 
     as: 'options' 
    }}, 
    {$group: { 
     _id: "$_id", 
     name: {$first: "$name"}, 
     question: {$push: { 
      title: "$questions.title", 
      form: "$questions.form", 
      options: "$options" 
     }} 
    }} 
]) 
+0

ヘルプ友人のためのTksが、動作しませんでした。 :( –

+0

どのようにそれはあなたのために働いていないのですか?私はちょうど分前にそれにいくつかの調整を行った。 – lascort

+0

私はあなたの最後の編集を得た。私はそれを見た。あなたの構造その結果、正しいです。しかし、それはデータを持っていません。ここで結果を見てください:https://pastebin.com/qddteCTq –

関連する問題