【问题标题】:MongoDB nested lookup with 3 child levels具有 3 个子级别的 MongoDB 嵌套查找
【发布时间】:2017-12-15 17:24:12
【问题描述】:

我需要从数据库中检索整个单个对象层次结构作为 JSON。 我正在尝试汇总数小时,但无法解决如何处理我的数据。所以我有三个集合:

表格

{ "_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" }

我需要检索每个表格以及所有相应的问题,以及每个问题的选项。像这样:

[
   {
      _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": []
          }
      ]
   },
   ...
]

我已经尝试了很多 $lookup、$unwind、另一个 $lookup 和 $project,但没有任何结果(里面有问题的表格,里面有选项的问题)。

请帮帮我! :)

【问题讨论】:

    标签: mongodb mongoose mongodb-query


    【解决方案1】:

    我认为周围是查询question 集合,查找他们的questions 并按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
        }}
    ]);
    

    实际上.. 这似乎是一个更好的选择。它将返回 forms 而没有 questions。

    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"
            }}
        }}
    ])
    

    【讨论】:

    • 它怎么不适合你?几分钟前我对其进行了一些调整。
    • 我得到了你的最后一次编辑。我看到了。你结果的结构,是对的。但它没有数据。看看这里的结果:pastebin.com/qddteCTq
    • 我可以看到一个问题,如果表单没有问题,它就不会出现在结果中,但是我创建了您作为示例提供的集合,我得到了这个结果:pastebin.com/0DqFq8LS
    • 对不起!这行得通!我只是想念您正在查询“问题”集合。它工作正常。谢谢!你拯救了我的一天。
    • @TiagoGouvêa 检查更新后的答案,第二个聚合似乎是一个更好的选择
    猜你喜欢
    • 2016-07-01
    • 2021-08-06
    • 1970-01-01
    • 2018-12-22
    • 2012-02-21
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多