在MongoDB 4.2的更新命令中,有3种Aggregate Pipeline Stage可用,可以进行字段间的运算
简要介绍
概述
总结
在MongoDB 4.2版本的Update功能中,可以使用以下的聚合管道阶段。
-
- $set
$addFieldsのエリアス
$unset
$projectのエリアス
$replaceWith
$replaceRootのエリアス
这些是在MongoDB4.2中新增的功能,而MongoDB4.0之前的$set等操作符是Update操作符,而上述是通过Aggregate管道阶段来实现。
环境
-
- Windows10
- MongoDB 4.2.0
文件格式
迄今为止的格式
db.collection.update({query},{upadte},{option})
当使用MongoDB4.2中新增的聚合管道阶段时的格式
db.collection.update({update},[pipeline],{option})
实施案例
执行案例1
注册样本数据
db.collection.insert({key:1,a:1})
在Key为1的文件中,将字段b设置为a+10。
db.collection.update({key:1}, [{$set:{b:{$sum:["$a",10]}}}])
db.collection.find({key:1})
{ "_id" : ObjectId("5d6331f494b7acefeeba2d7b"), "key" : 1, "a" : 1, "b" : 11 }
执行示例2
样本数据的注册
db.collection.insert({key:2, a:1, b1:1, b2:"bbb", c:100})
在key为2的文档中,将b1和b2设为子文档,并命名为b。
db.collection.update({key:2},
[{$set:{b:{b1:"$b1",b2:"$b2"}}},
{$unset:["b1","b2"]}
])
db.collection.find({key:2})
{ "_id" : ObjectId("5d6334d81a1cb0219588b62c"), "key" : 2, "a" : 1, "c" : 100, "b" : { "b1" : 1, "b2" : "bbb" } }
创建$b的子文档后,使用$unset删除原来的b1和b2。
需要注意的是,在$unset中不要给字段名添加$。
以下是第三个实例。
在比起示例1更加复杂的情况下,根据条件将操作对象字段分开。
注册样本数据
db.collection.insert({key:3,a:1, b:10, c:"1", d:20})
如果c等于”1″,则将a加到d上;否则,将b加到d上。
db.collection.update({key:3},
[{$set:{d:{$cond:{
if: {$eq:["$c","1"]},
then: {$sum:["$d","$a"]},
else: {$sum:["$d","$b"]}
}}}}
])
确认D已经从20更新到21。
> db.collection.find({key:3})
{ "_id" : ObjectId("5d6337d61a1cb0219588b62d"), "key" : 3, "a" : 1, "b" : 10, "c" : "1", "d" : 21 }
总结
我很高兴以前在应用程序中进行的处理现在可以使用Update操作符完成。
我认为如果以后也可以使用类似$lookup的阶段,那就太好了。
参考
- https://docs.mongodb.com/manual/reference/method/db.collection.update/