mongodb 如何实现多表连改?
比如我现在有两个表,结构分别为:
// 表 A :
[{
id: 1,
name: 'aa'
}, {
id: 2,
name: 'bb'
}, {
id: 3,
name: 'cc'
}]
// 表 B :
[{
user: '张三',
array: [{ id: 1, name: 'aa' }, { id: 2, name: 'bb' }, { id: 3, name: 'cc' }]
}, {
user: '李四',
array: [{ id: 1, name: 'aa' }, { id: 2, name: 'bb' }, { id: 3, name: 'cc' }]
}, {
user: '王五',
array: [{ id: 1, name: 'aa' }, { id: 2, name: 'bb' }, { id: 3, name: 'cc' }]
}]
如果我现在操作修改 表A 中的数据,比如 id: 2
所在对象改为 { id: 2, name: 'dd' }
请问 mongo 是否可以在修改 表A 的同时修改 表B 中所有人物的 array 中的 id: 2
所在项
我现在能想到的就是笨办法就是改完 表A 之后嵌套遍历 表B,在通过匹配逐一修改,但我感觉这样做既没有效率也够笨重
还望指点,谢谢!
回复
1个回答

test
2024-07-04
你可以先用 $lookup 连接表 A 和表 B,然后使用 $map 和 $mergeObjects 更新表 B 中的数据:
db.B.aggregate([
{
$lookup: {
from: 'A',
let: { array: '$array' },
pipeline: [
{
$match: {
$expr: { $in: ['$_id', '$$array.id'] }
}
}
],
as: 'A'
}
},
{
$addFields: {
array: {
$map: {
input: '$array',
as: 'item',
in: {
$mergeObjects: [
'$$item',
{
$arrayElemAt: [
{
$filter: {
input: '$A',
as: 'a',
cond: { $eq: ['$$a._id', '$$item.id'] }
}
},
0
]
}
]
}
}
}
}
},
{
$project: {
A: 0
}
},
{
$out: 'B'
}
])
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容