MongoDB 4.0如何合并子文档中的所有值?
展开MongoDB集合中子文档并关联父文档_id
原始集合数据
[ { "_id": "603f8c970f25800300a6c16e", "Hash": "vkqsgIPmB4/am4KJkERghDmmCUXEZjrGQxdCF3Fll2brR0YxJSXeTg==", "Components": [ { "FieldA": "A-1", "FieldB": "B-1" }, { "FieldA": "A-2", "FieldB": "B-2" } ] }, { "_id": "609f8c970f25800300a7c16e", "Hash": "vkqsgIPmB4/am4KJkERghDmmCUXEZjrGQxdCF3Fll2brR0sddggdTs==", "Components": [ { "FieldA": "A-3", "FieldB": "B-3" }, { "FieldA": "A-4", "FieldB": "B-4" } ] } ]
期望输出结果
[ { "_id": "603f8c970f25800300a6c16e", "FieldA": "A-1", "FieldB": "B-1" }, { "_id": "603f8c970f25800300a6c16e", "FieldA": "A-2", "FieldB": "B-2" }, { "_id": "609f8c970f25800300a7c16e", "FieldA": "A-3", "FieldB": "B-3" }, { "_id": "609f8c970f25800300a7c16e", "FieldA": "A-4", "FieldB": "B-4" } ]
解决方案(MongoDB 4.0兼容)
使用MongoDB聚合框架,通过$unwind和$replaceRoot组合实现需求:
db.yourCollectionName.aggregate([ // 展开Components数组,每个数组元素生成独立文档 { $unwind: "$Components" }, // 合并父文档_id与子文档字段,生成新的根文档 { $replaceRoot: { newRoot: { $mergeObjects: [ { _id: "$_id" }, "$Components" ] } } } ])
步骤说明
- $unwind:将每个父文档中的
Components数组拆分为多条文档,每条文档对应数组中的一个子元素,同时保留父文档的所有字段。 - $replaceRoot + $mergeObjects:将父文档的
_id与子文档的FieldA、FieldB合并为新的根文档,自动丢弃不需要的Hash和原Components字段。
如果需要更基础的写法(兼容更低版本),也可以用$project手动指定字段:
db.yourCollectionName.aggregate([ { $unwind: "$Components" }, { $project: { _id: 1, FieldA: "$Components.FieldA", FieldB: "$Components.FieldB" } } ])
内容的提问来源于stack exchange,提问作者Nicolas Dias
相关产品推荐
相关产品推荐

