首页 > 解决方案 > mongodb中的父子查询

问题描述

我收集了这些数据:

[
  {
    _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 中没有找到任何查询。那可能吗 ?我将此模式用于商店评论,我需要这样排序。对于 sql 查询,我在 youtube 上找到了这个视频:https ://www.youtube.com/watch?v=yA-YqKBNyNc

标签: mongodbmongoosemongodb-query

解决方案


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

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

推荐阅读