2017-08-14 78 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" 
     } 
    } 
} 

所有伟大的。如果我现在添加到原来的查询是应该找到具有相同ID作为答案(如questions.options.id == answers.id答案选项的比赛,事情并没有工作,我期望

最后的管道是:

这将返回一个空的结果。但是,如果我从"$answers.id"改变$match的RHS到20,它返回预期score: 4。我什么都试过了我能想到的,但不能让它的工作,不能理解为什么它不起作用

回答

0

我能够得到它具有以下管道工作:

{ 
    $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实际上并没有引用预期的领域其实......我需要使用$questions.options.id,它不会作为$match的LHS工作,因此需要添加一个额外的辅助属性。

相关问题