【问题标题】:mongodb $lookup 3 level nested documentmongodb $lookup 3 级嵌套文档
【发布时间】:2019-03-20 18:00:18
【问题描述】:

我是 mongo 的新手,并且在以下方面苦苦挣扎。 在我的 mongodb 数据库中,有 3 个集合,结构如下。

lv1:

{
    "_id": ObjectId("58650f1abbf1cd8804d0abde"), 
    "name": "lv1_aaa"
}

lv2:

{
    "_id": ObjectId("5ba45de41e78c7eb3fdfbfa6"), 
    "lv1_id": ObjectId("58650f1abbf1cd8804d0abde"), 
    "name": "lv2_bbb"
}

lv3:

{
    "_id": ObjectId("5ba45de41e78c7eb3fdfbfa6"), 
    "lv1_id": ObjectId("58650f1abbf1cd8804d0abde"),
    "lv2_id": ObjectId("58d8c3e1bbf1cd7436117bd6"), 
    "name": "lv3_ccc"
}

如何使用 $lookup 获得下面的数据结构

[
    {
        "_id": ObjectId("58650f1abbf1cd8804d0abde"), 
        "name": "lv1_aaa",
        "children": [
            {
                "_id": ObjectId("5ba45de41e78c7eb3fdfbfa6"), 
                "lv1_id": ObjectId("58650f1abbf1cd8804d0abde"), 
                "name": "lv2_bbb",
                "children": [
                    {
                        "_id": ObjectId("5ba45de41e78c7eb3fdfbfa6"), 
                        "lv1_id": ObjectId("58650f1abbf1cd8804d0abde"),
                        "lv2_id": ObjectId("58d8c3e1bbf1cd7436117bd6"), 
                        "name": "lv3_ccc"
                    },
                    ......
                ]
            },
            ......
        ]
    },
    ......
]

任何帮助将不胜感激!

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    您可以尝试以下聚合与 mongodb 3.6 及以上

    db.lv1.aggregate([
      { "$sort": { _id: 1 } },
      { "$lookup": {
        "from": "lv2",
        "let": { "lv1_id": "$_id" },
        "pipeline": [
          { "$sort": { index: 1 } },
          { "$match": { "$expr": { "$eq": [ "$lv1_id", "$$lv1_id" ] } } },
          { "$lookup": {
            "from": "lv3",
            "let": { "lv2_id": "$_id" },
            "pipeline": [
              { "$sort": { index: 1 } },
              { "$match": { "$expr": { "$eq": [ "$lv2_id", "$$lv2_id" ] } } }
            ],
            "as": "children"
          }}
        ],
        "as": "children"
      }}
    ]);
    

    【讨论】:

    • 好!!!有用!非常感谢@Anthony Winzlet。还有一个问题,如果我想按lv1._id对lv1排序,按lv2.index对lv2排序,按lv3.index对lv3排序,那我该怎么办?
    • 在每个管道中使用$sort{$sort:{_id:1}}
    • 好的,现在 $sort 可以工作了。我已经编辑了答案:) 再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2020-11-26
    • 2020-12-29
    • 2019-04-29
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多