mongodb $ lookup 3-й уровень вложенного документа - PullRequest
0 голосов
/ 16 октября 2018

Я новичок в монго и сильно борюсь со следующим.В моей базе данных 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"
                    },
                    ......
                ]
            },
            ......
        ]
    },
    ......
]

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 16 октября 2018

Вы можете попробовать ниже агрегации с 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"
  }}
]);
...