MongoDB如何在单条查询中插入find结果并追加自定义字段
MongoDB单操作迁移集合数据并追加字段实现方法
直接使用MongoDB聚合管道就能在单条操作里完成需求,不需要先执行find拉取数据再手动拼接字段插入,核心特性说明:
- 原有字段会完整保留,不需要手动逐一声明,只需要配置你要追加的额外字段即可
- 支持通过筛选条件只处理符合要求的特定文档,不需要强制全表迁移
全量覆盖写入新集合
如果目标newCollection还未创建,或者你需要用处理后的数据完全覆盖新集合的原有内容,用$addFields追加字段 + $out写入的组合即可:
db.oldCollection.aggregate([ // 只需要处理特定文档时,放开下方$match阶段填写筛选条件即可 // { $match: { name: "XYZ" } }, { $addFields: { exists: true // 可同时追加多个字段,字段值支持固定值,也支持用聚合表达式动态计算生成 } }, // 把处理完成的所有文档写入目标集合 { $out: "newCollection" } ])
执行后新集合内的文档会自动保留原有name等字段,同时追加你设置的exists字段,格式如下:
{ "_id": ObjectId("原文档自带的ID值"), "name": "XYZ", "exists": true }
追加写入不覆盖已有新集合
如果newCollection已经存在,且你不想覆盖集合里的存量数据,把$out替换为$merge阶段即可,还可以自定义遇到重复文档时的处理规则:
db.oldCollection.aggregate([ { $match: { /* 填写需要的筛选条件 */ } }, { $addFields: { exists: true } }, { $merge: { into: "newCollection", on: "_id", // 用_id作为判断文档重复的唯一键 whenMatched: "replace", // 遇到重复文档时用新处理的内容替换旧值 whenNotMatched: "insert" // 没有匹配到重复文档时直接插入新记录 } } ])
注意:如果旧集合的原文档里已经存在和你要追加的字段同名的键,
$addFields会用你设置的新值覆盖原有字段值,如果需要保留原有值,可以在$addFields中通过$ifNull等聚合表达式做判断逻辑。
内容的提问来源于stack exchange,提问作者Prakhar Singh
相关产品推荐
相关产品推荐

