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

如何在MongoDB中实现两个集合的笛卡尔积(CROSS JOIN)?

在MongoDB中实现两个集合的笛卡尔积

根据你的需求,这里提供两种可行的实现方式,适配不同版本的MongoDB:

方法1:使用$crossJoin(MongoDB 5.0及以上版本)

MongoDB 5.0新增的$crossJoin聚合阶段可以直接生成两个集合的笛卡尔积,语法简洁高效:

db.Clothes.aggregate([
  {
    $crossJoin: { from: "Colors" }
  },
  {
    $project: {
      _id: 0,
      name: "$name",
      color: "$color.color"
    }
  }
])

逻辑说明

  • $crossJoin会将Clothes中的每一条文档与Colors中的每一条文档进行全量组合,生成包含两个集合字段的临时文档
  • $project阶段用于移除默认的_id字段,并将Colors集合中的color字段提取到顶层,最终得到你需要的格式

方法2:使用$lookup + $unwind(兼容MongoDB 3.2及以上版本)

如果你的MongoDB版本低于5.0,可以通过$lookup关联整个Colors集合,再用$unwind展开数组来实现笛卡尔积:

db.Clothes.aggregate([
  {
    $lookup: {
      from: "Colors",
      localField: "name",
      foreignField: "color",
      as: "colors"
    }
  },
  {
    $unwind: "$colors"
  },
  {
    $project: {
      _id: 0,
      name: "$name",
      color: "$colors.color"
    }
  }
])

逻辑说明

  • $lookup这里填写了两个集合中无关联关系的字段,会把Colors的所有文档都关联到Clothes的每一条文档中,存入colors数组
  • $unwind将colors数组拆分成独立的文档,每条对应一个颜色值
  • $project同样用于整理字段,输出目标格式

最终结果

两种方法执行后都会返回你期望的笛卡尔积:

[
  { "name": "t-shirt", "color": "yellow" },
  { "name": "t-shirt", "color": "red" },
  { "name": "pants", "color": "yellow" },
  { "name": "pants", "color": "red" }
]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:25:25