Mongo系列之update

1. 前言

db.xx.update():更新一条或多条,通过multi参数控制。
db.xx.updaetOne():更新一条。
db.xx.updateMany():更新多条。

2. update()

db.collection.update(    
	<query>, 
	<update>, 
	{       
		upsert: <boolean>,   
		multi: <boolean>,  
		writeConcern: <document>
	}
)

# 参数解释;
query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
writeConcern :可选,抛出异常的级别。

关于writeConcern参数使用的例子:

# 在writeConcern这个参数中制定了w 为 majority, wtimeout为 100:

try {
   db.restaurant.updateOne(
       { "name" : "Pizza Rat's Pizzaria" },
       { $inc: { "violations" : 3}, $set: { "Closed" : true } },
       { w: "majority", wtimeout: 100 }
   );
} catch (e) {
   print(e);
}

# 如果主服务器和至少一个辅助服务器在100毫秒内确认每个写操作,则返回:

{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }

# 如果确认花费的时间超过了wtimeout限制,则会引发以下异常:

WriteConcernError({
   "code" : 64,
   "errInfo" : {
      "wtimeout" : true
   },
   "errmsg" : "waiting for replication timed out"
}) :

3. updateOne()和updateMany()

在3.2之后的版本中,加入了一些新的方法。例如updateOne(),updateMany()等。updateOne()和updateMany()的用法都是一样的,只不过前者只更新符合条件的一个文档,后者更新符合条件的所有文档。

db.collection.updateMany(
   <filter>,
   <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ]
   }
)

# 参数解释;
filter: update的查询条件,类似sql update查询内where后面的。
update: update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的。
upsert: 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
writeConcern: 可选,抛出异常的级别。
collation: 可选的。指定排序规则。集合允许用户在字符串比较中指定特定的语言规则,例如字母大写和重音符号的规则。
arrayFilters: 可选的。 数组过滤条件,用于确定数组中那些元素需要更新。

3.1 writeConcern参数使用的例子

关于writeConcern参数使用的例子与上面的update中该参数的使用是一致的。

3.2 collation参数使用的例子

Collation Locales and Default Parameters
假设数据库中有一个mycoll集合,集合中有如下文档:


{ _id: 1, category: "café", status: "A" }
{ _id: 2, category: "cafe", status: "a" }
{ _id: 3, category: "cafE", status: "a" }

在collation参数中进行了如下操作:

db.myColl.updateOne(
   { category: "cafe" },
   { $set: { status: "Updated" } },
   { collation: { locale: "fr", strength: 1 } }
);

3.3 arrayFilters 参数的例子

准备如下数据:

db.students.insert([
   { "_id" : 1, "grades" : [ 95, 92, 90 ] },
   { "_id" : 2, "grades" : [ 98, 100, 102 ] },
   { "_id" : 3, "grades" : [ 95, 110, 100 ] }
])
//在<update>中,使用$[<identifier>]运算符来定义标识符,然后在数组过滤器中引用该标识符。 如下面所使用的element。
db.students.update(
   { grades: { $gte: 100 } },
   { $set: { "grades.$[element]" : 100 } },
   {
     multi: true,
     arrayFilters: [ { "element": { $gte: 100 } } ]
   }
)

更新后结果:

{ "_id" : 1, "grades" : [ 95, 92, 90 ] }
{ "_id" : 2, "grades" : [ 98, 100, 100 ] }
{ "_id" : 3, "grades" : [ 95, 100, 100 ] }

4. replaceOne()

替换文档。

db.collection.replaceOne(
   <filter>,
   <replacement>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>
   }
)

下面的例子对 users 集合使用 db.collection.replaceOne() 方法将通过过滤条件 name 等于 “sue” 匹配到的 第一个 文档替换为新文档:

db.users.replaceOne(
   { name: "abc" },
   { name: "amy", age: 34, type: 2, status: "P", favorites: { "artist": "Dali", food: "donuts" } }
)

其余参数的使用与updateOne()/updateMany()相同。

5. 更新操作符

操作符描述
字段
$currentDate将字段的值设置为当前日期(日期或时间戳)。
$inc将字段的值增加指定的数值。可以同时写多个字段增加/减少多个指定的数值。
$min仅当指定值小于现有字段值时才更新该字段。
$max仅当指定值大于现有字段值时才更新该字段。
$mul将字段的值乘以指定的数量。
$rename重命名字段名。
$set设置文档中字段的值。
$setOnInsert如果更新导致插入文档,则设置字段的值。 对修改现有文档的更新操作没有影响。
$unset从文档中删除指定的字段。
数组
$充当占位符,以更新与查询条件匹配的第一个元素。
$[]充当占位符,以更新匹配查询条件的文档的数组中的所有元素。
$[]充当占位符,以更新与查询条件匹配的文档的所有与arrayFilters条件匹配的元素。
$addToSet仅当元素不存在于集合中时才将它们添加到数组中。
$pop删除数组的第一项或最后一项。
$pull删除所有与指定查询匹配的数组元素。
$push向数组中添加一项。
$pullAll从数组中删除所有匹配的值。
修饰符
$each修改$ push和$ addToSet运算符以附加多项以进行数组更新。
$position修改$push运算符,以指定要添加元素的数组中的位置。
$slice修改$push运算符以限制更新数组的大小。
$sort修改$push运算符以对存储在数组中的文档重新排序。
$bit执行整数值的按位AND,OR和XOR(异或)更新。

6. 参考文献

[1] MongoDB 中文文档
[2] MongoDB 官方文档
[3] mongoDB 中文社区
[4] MongoDB update 更新命令汇总
[5] mongodb中对字符串按照数值来排序【collation】
[6] Collation Locales and Default Parameters

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值