【问题标题】:Parent child query in mongodbmongodb中的父子查询
【发布时间】:2020-01-04 06:36:28
【问题描述】:

我收集了这些数据:

[
  {
    _id: "id1",
    parentId: null,
    text: "text 1"
  },
  {
    _id: "id2",
    parentId: null,
    text: "text 2"
  },
  {
    _id: "id3",
    parentId: null,
    text: "text 3"
  },
  {
    _id: "id4",
    parentId: "id1",
    text: "text 4"
  },
  {
    _id: "id5",
    parentId: "id1",
    text: "text 5"
  },
  {
    _id: "id6",
    parentId: "id2",
    text: "text 6"
  },
  {
    _id: "id7",
    parentId: "id5",
    text: "text 7"
  }
]

我希望每个孩子都像这样跟随父母:

[
  {
    _id: "id1",
    parentId: null,
    text: "text 1"
  },
  {
    _id: "id4",
    parentId: "id1",
    text: "text 4"
  },
  {
    _id: "id5",
    parentId: "id1",
    text: "text 5"
  },
  {
    _id: "id7",
    parentId: "id5",
    text: "text 7"
  },
  {
    _id: "id2",
    parentId: null,
    text: "text 2"
  },
  {
    _id: "id6",
    parentId: "id2",
    text: "text 6"
  },
  {
    _id: "id3",
    parentId: null,
    text: "text 3"
  }
]

但我在 mongodb 中没有找到任何查询。那可能吗 ? 我将此模式用于存储 cmets,我需要这样排序。 对于 sql 查询,我在 youtube 上找到了这个视频:https://www.youtube.com/watch?v=yA-YqKBNyNc

【问题讨论】:

    标签: mongodb mongoose mongodb-query


    【解决方案1】:

    这是一个使用聚合框架的解决方案:

    db.test.aggregate([{
        $addFields: {
            parentIdId: {
                $concat: [{
                    $ifNull: [{
                        $toString: "$parentId"
                    }, ""]
                }, {
                    $toString: "$_id"
                }]
            }
        }
    }, {
        $sort: {
            parentIdId: 1
        }
    }, {
        $project: {
            parentIdId: 0
        }
    }])
    

    结果:

    {"_id":"id1","parentId":null,"text":"text 1","parentIdId":"id1"}
    {"_id":"id4","parentId":"id1","text":"text 4","parentIdId":"id1id4"}
    {"_id":"id5","parentId":"id1","text":"text 5","parentIdId":"id1id5"}
    {"_id":"id2","parentId":null,"text":"text 2","parentIdId":"id2"}
    {"_id":"id6","parentId":"id2","text":"text 6","parentIdId":"id2id6"}
    {"_id":"id3","parentId":null,"text":"text 3","parentIdId":"id3"}
    {"_id":"id7","parentId":"id5","text":"text 7","parentIdId":"id5id7"}
    

    在这个解决方案中,我在您的查询结果中创建一个新字段,它是 parentId 和 Id 的串联,然后我对其进行排序。

    如果你想去掉这个技术领域,你可以添加这个管道阶段:

    {$project: {parentIdId: 0}}
    

    您的最终查询将是:

    db.test.aggregate([{
        $addFields: {
            parentIdId: {
                $concat: [{
                    $ifNull: [{
                        $toString: "$parentId"
                    }, ""]
                }, {
                    $toString: "$_id"
                }]
            }
        }
    }, {
        $sort: {
            parentIdId: 1
        }
    }, {
        $project: {
            parentIdId: 0
        }
    }])
    

    【讨论】:

    • 谢谢,我运行了你的查询,但我得到了这个错误:```$concat 只支持字符串,不支持 objectId" ```
    • 您可以使用$toString。我将其添加到答案中
    • 我添加了,但我得到了这个错误:无法识别的表达式'$toString
    • 已在答案中修复
    • 谢谢,但我仍然有这个错误:无法识别的表达式'$toString
    猜你喜欢
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    相关资源
    最近更新 更多