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

DocumentDB:无需$lookup,高效添加同order_id的关联交易数组

无需$lookup的实现方案:使用聚合管道的$group+$unwind

针对你的需求,我们可以通过聚合管道的$group+$unwind组合实现,全程仅需一次集合扫描(利用order_id索引加速),避免$lookup的N次关联查询开销,性能更优。

完整聚合代码(包含自身到relatedTxs)

db.yourCollection.aggregate([
  // 备份原始文档,方便后续复用
  {
    $addFields: {
      originalDoc: "$$ROOT"
    }
  },
  // 按order_id分组,收集同订单的所有交易到relatedTxs数组
  {
    $group: {
      _id: "$order_id",
      relatedTxs: { $push: "$originalDoc" },
      docs: { $push: "$originalDoc" } // 保存同订单的所有文档,用于拆分
    }
  },
  // 将同订单的文档数组拆分为单个文档
  {
    $unwind: "$docs"
  },
  // 合并原始文档与relatedTxs数组,作为最终输出文档
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [
          "$docs",
          { relatedTxs: "$relatedTxs" }
        ]
      }
    }
  }
])

可选:排除自身在relatedTxs中

如果不需要在relatedTxs中包含当前文档,只需修改$replaceRoot阶段,添加$filter过滤自身:

{
  $replaceRoot: {
    newRoot: {
      $mergeObjects: [
        "$docs",
        {
          relatedTxs: {
            $filter: {
              input: "$relatedTxs",
              cond: { $ne: ["$$this._id", "$docs._id"] }
            }
          }
        }
      ]
    }
  }
}

方案说明

  1. $addFields:将当前完整文档存入originalDoc字段,确保后续分组时能保留原始数据结构。
  2. $group:依托order_id索引快速分组,将同订单的所有交易文档收集到relatedTxs数组,同时用docs字段保存同组文档用于后续拆分。
  3. $unwind:将docs数组拆分为单个文档,此时每个文档同时携带当前订单的完整relatedTxs数组。
  4. $replaceRoot:将原始交易文档与relatedTxs数组合并,输出最终的结构化文档。

性能优势

该方案仅需一次集合扫描,完全利用order_id索引的分组能力;而传统$lookup需要对每个文档执行一次关联查询(相当于N次集合扫描,N为文档总数),在数据量较大时性能差距会非常明显,尤其适配DocumentDB的查询优化逻辑。

内容的提问来源于stack exchange,提问作者Ale Sanchez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:35:23