You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 09:46:40