MongoDB能否通过聚合lookup与merge管道跨集合复制字段
可以实现,通过$lookup做跨集合关联匹配、$merge做结果写回,完全能满足字段同步的需求,不需要额外的应用层代码处理。
匹配规则对应
两边文档的关联条件为双字段匹配:
item_projections.orderId与orders.id相等(订单维度匹配)item_projections.itemId与orders.items.itemId相等(商品维度匹配)
匹配命中后提取orders.items.status的值,写入目标文档的status字段即可。
执行语句
直接在item_projections集合上运行如下聚合管道:
db.item_projections.aggregate([ { $lookup: { from: "orders", let: { queryOrderId: "$orderId", queryItemId: "$itemId" }, pipeline: [ { $match: { $expr: { $and: [ { $eq: ["$id", "$$queryOrderId"] }, { $eq: ["$items.itemId", "$$queryItemId"] } ] } } }, { $project: { _id: 0, status: "$items.status" } } ], as: "orderMatchRes" } }, { $set: { status: { $first: "$orderMatchRes.status" } } }, { $unset: "orderMatchRes" }, { $merge: { into: "item_projections", on: "_id", whenMatched: "replace", whenNotMatched: "insert" } } ])
版本说明:该语句要求MongoDB版本为4.2及以上,
$merge写入阶段从4.2版本开始正式支持。
执行完成后查询item_projections集合,即可得到预期的带status字段的文档结构。
内容的提问来源于stack exchange,提问作者ketrab321
相关产品推荐
相关产品推荐

