具有 3 个子级别的 MongoDB 嵌套查找

标签 mongodb mongoose mongodb-query

我需要从数据库中检索整个单个对象层次结构作为 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,但都没有给我这个结果(里面有问题的表格,里面有选项的问题)。

请帮我! :)

最佳答案

我认为周围正在查询question收藏,查找他们的 question s 并按 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 s 没有 question也是。
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"
        }}
    }}
])

关于具有 3 个子级别的 MongoDB 嵌套查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45038087/

相关文章:

linux - 在 Linux 上安装 Mongodb C++ 驱动程序

javascript - 使用 Mongoose 在 MongoDB 中按聚合层次进行 $match

mongodb - `mongolab` - 发布时出错,无法发布数据

MongoDB在列表列表中查找值

javascript - MongoDB:单次更新中的$push 多个对象和$pop 多个对象

javascript - 用对象列表替换字符串列表 - mongoDB

arrays - 获取元素 mongodb 聚合的索引

javascript - 从 mongo 集合中的数组为 Select2 选项创建标签对象

node.js - Mongoose 中的一对多关系

javascript - Mongoose 查询返回按单个字段分组的文档的最新版本