mongo中updateOne操作

307 阅读3分钟
基本语法

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>查询的文档或者字符串,
该选项可以采用索引规范文档或索引名称字符串。
如果指定的索引不存在,则操作错误