在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/
广告
将在 10 秒后关闭
bannerAds