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'
}
}
}
])
我有一个文档分类列表:documentCategory
我有一个文档 table
如何将 Document 中的单个文档放入 documentCategory
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'
}
}
}
])