如何在C#中通过单次MongoDB调用合并两个集合的输出?
在MongoDB中单次调用合并指定文档与单文档集合的方法
可以通过MongoDB的聚合管道实现单次数据库调用完成合并,以下是两种可行方案:
方案一:$lookup + $unwind + $mergeObjects 组合
直接从CollectionA发起聚合,匹配目标文档后关联CollectionB,再合并字段:
db.CollectionA.aggregate([ // 定位CollectionA中UniqueId=1的目标文档 { $match: { UniqueId: 1 } }, // 拉取CollectionB的唯一文档(空管道获取全部,即那一个文档) { $lookup: { from: "CollectionB", pipeline: [], as: "bData" } }, // 将数组格式的关联结果转为单个嵌套文档 { $unwind: "$bData" }, // 合并当前文档与CollectionB的文档字段 // 注:参数顺序决定冲突字段的覆盖优先级,后写的会覆盖先写的 { $replaceRoot: { newRoot: { $mergeObjects: ["$$ROOT", "$bData"] } } }, // 清理临时生成的bData字段 { $project: { bData: 0 } } ])
方案二:简化版$addFields + $mergeObjects
利用$arrayElemAt直接提取CollectionB的唯一文档,省去$unwind步骤:
db.CollectionA.aggregate([ { $match: { UniqueId: 1 } }, // 直接获取CollectionB的文档并添加为临时字段 { $addFields: { bData: { $arrayElemAt: [ { $lookup: { from: "CollectionB", pipeline: [], as: "temp" } }, 0 ] } } }, // 合并字段并替换根文档 { $replaceRoot: { newRoot: { $mergeObjects: ["$$ROOT", "$bData"] } } }, // 移除临时字段 { $project: { bData: 0 } } ])
注意事项
- 两种方案均为单次数据库请求,避免了API层两次查询的性能开销
- 若两个集合存在重名字段,
$mergeObjects的参数顺序决定最终保留哪个值:比如想让CollectionA的字段优先,就把"$$ROOT"放在后面 - 因为CollectionB仅含一个文档,所以
$lookup使用空管道不会有性能问题,无需额外过滤条件
内容的提问来源于stack exchange,提问作者Thiru
相关产品推荐
相关产品推荐

