如何在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
相关产品推荐
相关产品推荐

