基本语法
db.collection.updateOne(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>,
arrayFilters: [ <filterdocument1>, ... ],
hint: <document|string> // Available starting in MongoDB 4.2.1
}
)
参数详解
upsert
可选,当为true时,如果按照<filter>过滤条件没有找到则会创建一条新的数据,找到的话就会更新数据。
默认false,表示如果按照<filter>条件没有匹配到不插入数据
writeConcern
write concern 表示写请求的安全级别
语法
{ w: <value>, j: <boolean>, wtimeout: <number> }
w : 该选项要求确认操作已经传播到指定数量的mongod实例或指定标签的mongod实例
w可选的的值
<number>
w:1(应答式写入)
要求确认操作已经传播到指定的单个mongod实例或副本集主实例(缺省为1)
w:0(非应答式写入)
不返回任何响应,所以无法知道写入是否成功
但是对于尝试向已关闭的套接字写入或者网络故障会返回异常信息
w:>1(用于副本集环境)
该值用于设定写入节点的数目,包括主节点
"majority"(大多数)
适用于集群架构,要求写入操作已经传递到绝大多数投票节点以及主节点后进行应答
<tag set>
要求写入操作已经传递到指定tag标记副本集中的成员后进行应答
j : 该选项要求确认写操作已经写入journal日志之后应答客户端(需要开启journal功能)
则在意外重启,宕机等情形下可以通过journal来进行数据恢复
写入journal操作必须等待直到下次提交日志时完成写入
为降低延迟,MongoDB可以通过增加commit journal的频率来加快journal写入
wtimeout:
该选项指定一个时间限制,以防止写操作无限制被阻塞导致无法应答给客户端
wtimeout的单位为ms,当w值大于1时生效,该参数即仅适用于集群环境
当某个节点写入时超出指定wtimeout之后,mongod将返回一个错误
在捕获到超时之前,mongod并不会撤销其他节点已成功完成的写入
wtimeout值为0时等同于没有配置wtimeout选项,容易导致由于某个节点挂起而无法应答
Collation
用于根据不同的语言制定排序规则
语法
{
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}
说明: 当Collation指定时必须有locale参数,其他是可选的
示例
db.createCollection("person")
db.person.insert({name: "张三"})
db.person.insert({name: "李四"})
db.person.insert({name: "王五"})
db.person.insert({name: "马六"})
db.person.insert({name: "张七"})
默认情况下,名字字段会被当做一个普通的二机制字符串来对比,按照name字段排序的结果如下
mongo-9554:PRIMARY> db.person.find().sort({name: 1})
{ "_id" : ObjectId("586b98980cec8d86881cffac"), "name" : "张七" }
{ "_id" : ObjectId("586b98980cec8d86881cffa8"), "name" : "张三" }
{ "_id" : ObjectId("586b98980cec8d86881cffa9"), "name" : "李四" }
{ "_id" : ObjectId("586b98980cec8d86881cffaa"), "name" : "王五" }
{ "_id" : ObjectId("586b98980cec8d86881cffab"), "name" : "马六" }
而对于中文名字,通常有按拼音顺序排序的需求,这时就可以通过collation来搞定
db.createCollection("person", {collation: {locale: "zh"}})
db.person.insert({name: "张三"})
db.person.insert({name: "李四"})
db.person.insert({name: "王五"})
db.person.insert({name: "马六"})
db.person.insert({name: "张七"})
arrayFilters
可选的。一个数组类型的filter文档,这个数组类型的文档决定了要对数组中的哪一个元素做修改操作
示例
插入数据
db.students.insertMany([ { "_id" : 1, "grades" : [ 95, 92, 90 ] },
{ "_id" : 2, "grades" : [ 98, 100, 102 ] },
{ "_id" : 3, "grades" : [ 95, 110, 100 ] }
] )
执行更新
db.students.updateOne(
{ grades: { $gte: 100 } },
{ $set: { "grades.$[element]" : 100 } },
{ arrayFilters: [ { "element": { $gte: 100 } } ] }
)
结果
{ "_id" : 1, "grades" : [ 95, 92, 90 ] }
{ "_id" : 2, "grades" : [ 98, 100, 100 ] } // 只有这条数据更新了
{ "_id" : 3, "grades" : [ 95, 110, 100 ] }
hint
可选的。是一个索引,用于支持<filter>查询的文档或者字符串,
该选项可以采用索引规范文档或索引名称字符串。
如果指定的索引不存在,则操作错误