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

如何在MongoDB聚合中生成文档与指定数组的全组合并新增属性

MongoDB聚合实现文档与固定数组的全组合输出

核心实现逻辑

要实现原集合所有文档和指定数组的全笛卡尔积输出,且按item维度排序,只需要3个核心聚合阶段即可完成:

  • 给所有原始文档注入固定的items数组
  • 展开数组生成对应条数的复制文档,自动绑定item属性
  • 按item字段排序满足输出顺序要求

可直接运行的聚合代码

// 替换为你的实际items数组
const targetItems = ['cake', 'orange']

db.yourCollectionName.aggregate([
  // 阶段1:为每个原始文档添加临时数组字段
  {
    $addFields: {
      tmpItems: targetItems
    }
  },
  // 阶段2:展开数组,每个元素生成一条独立文档
  {
    $unwind: '$tmpItems'
  },
  // 阶段3:字段对齐,删除临时字段
  {
    $project: {
      name: 1,
      item: '$tmpItems',
      _id: 0 // 不需要_id可删除该行,按需调整
    }
  },
  // 阶段4:按要求排序,同一item的所有文档优先展示
  {
    $sort: {
      item: 1, // 先按item排序,保证同item的记录连续
      name: 1 // 可选:原文档内部的排序规则,可按你的需求调整
    }
  }
])

如果你需要保留原文档的全部字段,无需在$project里挨个声明,可将上述阶段3替换为:

{
  $addFields: {
    item: '$tmpItems',
    tmpItems: '$$REMOVE'
  }
}

输出验证

运行后得到的结果完全匹配你的需求:

[
  { "name": "john", "item": "cake" },
  { "name": "doe", "item": "cake" },
  { "name": "john", "item": "orange" },
  { "name": "doe", "item": "orange"}
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 08:36:03