MongoDb $lookup 数组字段中的嵌套文档

MongoDb $lookup nested document in array fields

我有一个文档分类列表:documentCategory 我有一个文档 table
如何将 Document 中的单个文档放入 documentCategory

中的 UI 个子项中

1、I have a list of document categories : documentCategory

{
    "_id" : ObjectId("61cd249f50f3abf2e172d743"),
    "name" : "Vue3",
    "pid" : "-1",
    "level" : 1,
    "children" : [ 
        {
            "name" : "UI",
            "pid" : "61cd249f50f3abf2e172d743",
            "level" : 2,
            "_id" : ObjectId("61cd27d1f3b969fec5458d89")
        }
    ]
}


2、I have a document table  
{
    "_id" : ObjectId("61cd4813db3e3db388e1d7cf"),
    "name" : "ElementUI",
    "cid" : "61cd27d1f3b969fec5458d89",
    "cname" : "UI",
    "pid" : "61cd249f50f3abf2e172d743",
    "pname" : "Vue3",
}

希望得到结果:


{
    "_id" : ObjectId("61cd249f50f3abf2e172d743"),
    "name" : "Vue3",
    "pid" : "-1",
    "level" : 1,
    "children" : [ 
        {
            "name" : "UI",
            "pid" : "61cd249f50f3abf2e172d743",
            "_id" : ObjectId("61cd27d1f3b969fec5458d89"),  
            children:[
                {name:'ElementUI'},{name:'**'}
            ]
        }
    ]
}

如何将 Document 中的单个文档放入 documentCategory

中的 UI 个子项中

由于您试图将 ObjectId 与字符串相匹配,因此我必须添加 $set 阶段以将它们转换为相同的类型(字符串)。

请注意,我将第二个系列命名为 tables 而不是 table,因为最佳做法是复数形式

db.collection.aggregate([
  {
    '$match': {
      'name': 'Vue3'
    }
  }, {
    '$unwind': {
      'path': '$children'
    }
  }, {
    '$set': {
      'children._id': {
        '$toString': '$children._id'
      }
    }
  }, {
    '$lookup': {
      'from': 'tables', 
      'localField': 'children._id', 
      'foreignField': 'cid', 
      'as': 'children.children', 
      'pipeline': [
        {
          '$project': {
            'name': 1, 
            '_id': 0
          }
        }
      ]
    }
  }, {
    '$group': {
      '_id': '$_id', 
      'name': {
        '$first': '$name'
      }, 
      'pid': {
        '$first': '$pid'
      }, 
      'level': {
        '$first': '$level'
      }, 
      'children': {
        '$push': '$children'
      }
    }
  }
])