MongoDB: update 操作

本文详细介绍了MongoDB中常见的更新操作及其用法,包括如何仅更新文档的一部分、如何使用$set和其他操作符来修改字段值,以及如何通过设置选项如multi和upsert来控制更新行为。

因为MongoDB 复杂的数据结构, 所以查询修改的语法要比RDBMS 的单表操作要复杂一些。 下面记录一些常见的Update 操作。

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

 

在MongoDB 2.6, 又多支持了一个选项 writeConcern: <document>。

  • <query> 决定什么样的document 会被更新
  • <update> 决定符合条件的document 会被更新成什么样
  • option upsert: 默认为false, 如果设为true, 如果<query> 没有match 里面的任何操作,这个update 会变成insert
  • option multi: 默认为false, 即使<query> 里面有很多记录,也只会更新第一行。

 

常用原型

db.table.update(<query>, <document>), 符合query 条件的第一条整条记录会被<document> 代替, <document> 没有使用$set 操作符号。

mongolog:PRIMARY> db.test.insert({"name":"name1", "params": {"p1":"v1", "p2": "v2"}, "type": "type1"})
WriteResult({ "nInserted" : 1 })
mongolog:PRIMARY> db.test.findOne()
{
    "_id" : ObjectId("5456e188bc391a4f85e4aa4f"),
    "name" : "name1",
    "params" : {
        "p1" : "v1",
        "p2" : "v2"
    },
    "type" : "type1"
}
mongolog:PRIMARY> db.test.update({"name":"name1"}, {"type":"type2"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
mongolog:PRIMARY> db.test.findOne()
{ "_id" : ObjectId("5456e051bc391a4f85e4aa4e"), "type" : "type2" } // 只剩下了type

 

db.table.update(<query>, {$set: {"key": "document"}}). 仅仅key 对应的document 会被document 代替, 如果对应的Key 没有,则添加这个key.

  • 如果只想修改param 的值,其他列的值保持不变:
mongolog:PRIMARY> db.test.update({"name":"name1"}, {$set: {"params": {"p2":"newV2"}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
mongolog:PRIMARY> db.test.findOne()
{
    "_id" : ObjectId("5456e406bc391a4f85e4aa51"),
    "name" : "name1",
    "params" : {
        "p2" : "newV2"  // Params 中只剩下p2
    },
    "type" : "type1"
}

 

  • 如果想只更新里面params.p2 的值,则需要
mongolog:PRIMARY> db.test.update({"name": "name1"}, {$set: {"params.p2":"newV2"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
mongolog:PRIMARY> db.test.findOne()
{
    "_id" : ObjectId("5456e267bc391a4f85e4aa50"),
    "name" : "name1",
    "params" : {
        "p1" : "v1",
        "p2" : "newV2"  // 只有p2 的值被更改
    },
    "type" : "type1"
}
  • 如果想增加一个params.p3, 只需要:
mongolog:PRIMARY> db.test.update({"name": "name1"}, {$set: {"params.p3":"v3"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
mongolog:PRIMARY> db.test.findOne()
{
    "_id" : ObjectId("5456e267bc391a4f85e4aa50"),
    "name" : "name1",
    "params" : {
        "p1" : "v1",
        "p2" : "newV2",
        "p3" : "v3"  
    },
    "type" : "type1"
}

 

db.table.update(<query>, <document>, { multi: true } ) 修改所有的符合条件的document。 
mongolog:PRIMARY> db.test.update({"name":"name1"}, {"$set": {"params.p4":"v4"}}) // 没有设置{mutli:true}, 只更新了一行
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
mongolog:PRIMARY> db.test.find()
{ "_id" : ObjectId("5456e406bc391a4f85e4aa51"), "name" : "name1", "params" : { "p1" : "v1", "p2" : "v2" }, "type" : "type1" }
{ "_id" : ObjectId("5456e267bc391a4f85e4aa50"), "name" : "name1", "params" : { "p1" : "v1", "p2" : "newV2", "p3" : "v3", "p4" : "v4" }, "type" : "type1" }
mongolog:PRIMARY> db.test.update({"name":"name1"}, {"$set": {"params.p5":"v5"}}, {multi:true})
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
mongolog:PRIMARY> db.test.find()
{ "_id" : ObjectId("5456e406bc391a4f85e4aa51"), "name" : "name1", "params" : { "p1" : "v1", "p2" : "v2", "p5" : "v5" }, "type" : "type1" }
{ "_id" : ObjectId("5456e267bc391a4f85e4aa50"), "name" : "name1", "params" : { "p1" : "v1", "p2" : "newV2", "p3" : "v3", "p4" : "v4", "p5" : "v5" }, "type" : "type1" }

 

db.table.update(<query>, <document>, {"upsert": true}) 如果没有matched 的文档,就会新insert 一行

mongolog:PRIMARY> db.test.update({"name":"name2"}, {$set: {"params.p2": "v22"}}, {"upsert": true})
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("5456e580c71b89fa66bff2f5")
})
mongolog:PRIMARY> db.test.find()
{ "_id" : ObjectId("5456e406bc391a4f85e4aa51"), "name" : "name1", "params" : { "p1" : "v1", "p2" : "v2", "p5" : "v5" }, "type" : "type1" }
{ "_id" : ObjectId("5456e267bc391a4f85e4aa50"), "name" : "name1", "params" : { "p1" : "v1", "p2" : "newV2", "p3" : "v3", "p4" : "v4", "p5" : "v5" }, "type" : "type1" }
{ "_id" : ObjectId("5456e580c71b89fa66bff2f5"), "name" : "name2", "params" : { "p2" : "v22" } }   

db.parameter.update({}, {$unset: {"hareware": ""}}, {multi:true})

转载于:https://www.cnblogs.com/zhfan/p/4070607.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值