文章目录
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