2017-08-14 11 views
0

私は以下の理由で困惑しています。誰でも説明できますか? 状況によっては、私の目標は、回答が質問とは別のコレクションに保存されている調査データベースの回答オプションに関連するスコアを取得することです。質問コレクションには、回答オプションの配列が含まれています。これらの回答オプションにはスコアがあります。このクエリを実行するMongoDB集約パイプラインマッチ - >ルックアップ - >アンワインド - >マッチ問題

db.answers.aggregate([ 
{ 
    $match: { 
     userId: "abc", 
     questionId: ObjectId("598be01d4efd70a81c1c5ad4") 
    } 
}, 
{ 
    $lookup: { 
     from: "questions", 
     localField: "questionId", 
     foreignField: "_id", 
     as: "question" 
    } 
}, 
{ 
    $unwind: "$question" 
}, 
{ 
    $unwind: "$question.options" 
}, 
{ 
    $unwind: "$answers" 
} 
]) 

私が取得:

{ 
    "_id" : ObjectId("598e588e0c5e24452c9ee769"), 
    "userId" : "abc", 
    "questionId" : ObjectId("598be01d4efd70a81c1c5ad4"), 
    "answers" : { 
     "id" : 20 
    }, 
    "question" : { 
     "_id" : ObjectId("598be01d4efd70a81c1c5ad4"), 
     "options" : { 
      "id" : 10, 
      "score" : "12" 
     } 
    } 
} 
{ 
    "_id" : ObjectId("598e588e0c5e24452c9ee769"), 
    "userId" : "abc", 
    "questionId" : ObjectId("598be01d4efd70a81c1c5ad4"), 
    "answers" : { 
     "id" : 20 
    }, 
    "question" : { 
     "_id" : ObjectId("598be01d4efd70a81c1c5ad4"), 
     "options" : { 
      "id" : 20, 
      "score" : "4" 
     } 
    } 
} 

すべて素晴らしいです。私は今、元のクエリに対する回答(例えばquestions.options.id == answers.idと同じIDを持つ解答選択肢を見つけることになって試合を追加すると、物事は私が期待するように動作しません

最終パイプラインは次のとおりです。

これは、空の結果を返します。しかし、私は"$answers.id"から20$matchのRHSを変更した場合、それは期待score: 4を返します。私は、私は考えることができるすべてを試してみましたが、それは仕事を得ることではないとすることはできませんでしたそれがうまくいかない理由を理解してください。

答えて

0

私はできましたそれは、次のパイプラインで動作するように取得するために:私はそれが直接の試合では動作しませんでした理由はquestions.options.idが実際に意図されたフィールドを参照していないということだと思います

{ 
    $match: { 
     userId: "abc", 
     questionId: ObjectId("598be01d4efd70a81c1c5ad4") 
    } 
}, 
{ 
    $lookup: { 
     from: "questions", 
     localField: "questionId", 
     foreignField: "_id", 
     as: "question" 
    } 
}, 
{ 
    $unwind: "$question" 
}, 
{ 
    $unwind: "$question.options" 
}, 
{ 
    $unwind: "$answers" 
}, 
{ 
    $addFields: { 
     areEqual: { $eq: [ "$question.options.id", "$answers.id" ] } 
    } 
}, 
{ 
    $match: { 
     areEqual: true 
    } 
}, 
{ 
    $project: { 
     _id: 0, 
     score: "$question.options.score" 
    } 
} 

...私が使用するために必要な$questions.options.idは、$matchのLHSとして機能しないため、追加のヘルパー属性を追加する必要があります。

関連する問題