基于MongoDB其他集合数据创建新条目实现方案问询
嘿,我完全懂你想要实现的效果——从collection2里取数据生成collection1的新文档,其中field3用固定默认值,field1保留原集合的数组类型对吧?其实真的没必要用$facet来做这个,那玩意儿是用来在同一个聚合管道里并行做多个不同的聚合统计的,和你这个批量复制+字段映射的需求不搭边。我给你两个直接好用的方案:
方案1:直接生成/替换collection1(适合目标集合为空或需要完全替换的场景)
用$project来映射字段、设置默认值,最后用$out把结果写入目标集合:
db.collection2.aggregate([ { $project: { field1: "$field_1", // 直接把collection2的数组字段field_1映射为collection1的field1,数组结构会完整保留 field2: "$field_2", field3: "manualValue", // 这里设置你要的固定默认值 _id: 0 // 如果不需要保留原collection2的_id,就加这行;想保留的话删掉即可 } }, { $out: "collection1" // 自动创建collection1(如果不存在),若已存在则替换整个集合 } ])
方案2:追加文档到已存在的collection1(不想覆盖原有数据时用)
如果collection1已经有数据,只想把新生成的文档加进去,就把$out换成$merge,还能自定义冲突处理逻辑:
db.collection2.aggregate([ { $project: { field1: "$field_1", field2: "$field_2", field3: "manualValue", _id: 0 } }, { $merge: { into: "collection1", whenMatched: "keepExisting" // 若遇到_id相同的文档,保留原collection1的内容;也可设为"replace"替换,或自定义逻辑 } } ])
关于数组字段的说明
你不用担心field_1是数组类型的问题,$project会原封不动地复制数组结构,比如原字段是["apple", "banana"],映射后的field1也会是一模一样的数组,不需要额外处理。
至于同事提到的$facet,举个例子你就明白它的用途了:比如你想同时统计collection2的文档总数、field_2的平均值,这时候用$facet可以在一次聚合里完成两个统计,把结果放在同一个文档的不同字段里。但对你现在的需求来说,完全是大材小用,甚至会把简单问题复杂化哦~
内容的提问来源于stack exchange,提问作者Vladimir
相关产品推荐
相关产品推荐

