MongoDB利用集合自有数据更新文档:新增字段s=m+n
如何用MongoDB现有字段计算并添加新字段
这个需求很常见——基于文档里已有的m和n字段计算它们的和,添加为新字段s。根据你使用的MongoDB版本,有几种不同的实现方式,我给你整理了最常用且高效的方案:
推荐:MongoDB 4.2+ 使用聚合管道更新
从MongoDB 4.2开始,官方支持在update()、updateMany()这类更新操作中直接使用聚合管道,这是最简洁高效的方式:
// 更新所有文档(空查询匹配全部) db.yourCollectionName.updateMany( {}, [ { $set: { s: { $add: ["$m", "$n"] } } } ] )
如果只想更新特定文档(比如你示例里的{m:1,n:3}),只需要把第一个参数换成对应的查询条件:
db.yourCollectionName.updateOne( { m: 1, n: 3 }, [ { $set: { s: { $add: ["$m", "$n"] } } } ] )
说明
- 聚合管道里的
$set阶段会直接通过$add操作符计算$m和$n的和,赋值给新字段s - 这种方式无需手动遍历文档,MongoDB会在服务器端高效完成计算与更新
MongoDB 3.4~4.0版本 聚合+批量更新
如果你的MongoDB版本在3.4到4.0之间,还不支持直接在update里用聚合管道,可以先通过聚合查询计算出s的值,再批量更新:
db.yourCollectionName.aggregate([ // 筛选需要更新的文档,空条件匹配全部,也可自定义过滤规则 { $match: {} }, // 添加计算好的s字段 { $addFields: { s: { $add: ["$m", "$n"] } } } ]).forEach(function(doc) { // 用_id精准匹配,更新s字段 db.yourCollectionName.updateOne( { _id: doc._id }, { $set: { s: doc.s } } ) })
应急方案:老版本(3.4以下)使用$where
如果你的MongoDB版本非常老(3.4之前),可以用$where实现,但强烈不推荐——$where会把每个文档转换成JavaScript对象,性能极差,还存在安全风险(若输入不可信)。应急代码如下:
db.yourCollectionName.updateMany( {}, { $set: { s: { $where: "this.m + this.n" } } } )
注意事项
- 如果部分文档缺少
m或n字段,$add会返回null;若只想更新同时存在m和n的文档,可将查询条件改为:{ m: { $exists: true }, n: { $exists: true } } - 记得把
yourCollectionName替换成你实际的集合名称
内容的提问来源于stack exchange,提问作者manoj
相关产品推荐
相关产品推荐

