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

