目录

 

MongoDB 更新文档

update() 方法

实例

各种更新操作符

"$set"
"$set" 与 "." 操作
"$unset"
"$inc"
"$rename"
"$pop"
"$push"
"$addToSet"
$pull
findAndModify()

附:


MongoDB 更新文档

MongoDB 使用 update() 和 save() 方法来更新集合中的文档。

update() 方法

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 :可选,抛出异常的级别。

官方连接连接地址:https://docs.mongodb.com/manual/reference/update-methods/

实例

我们先向数据库插入点数据(集合名称为 products):

{
  _id: 100,
  sku: "abc123",
  quantity: 250,
  instock: true,
  reorder: false,
  details: { model: "14Q2", make: "xyz" },
  tags: [ "apparel", "clothing" ],
  ratings: [ { by: "ijk", rating: 4 } ]
}

查询截图:

各种更新操作符

"$set"

"$set" 用来指定一个键的值。如果这个键不存在,则创建它。

示例:更新 quantity 字段、更新 details 的内容以及更新 tags 的值。

db.products.update(
   { _id: 100 },
   { $set:
      {
        quantity: 500,
        details: { model: "14Q3", make: "xyz" },
        tags: [ "coats", "outerwear", "clothing" ]
      }
   }
)

查询结果(可以看到对应的值已经被修改):

"$set" 与 "." 操作

示例:使用 "." 符号更新数据内容

db.products.update(
   { _id: 100 },
   { $set: { "details.make": "zzz" } }
)

 

同样可以使用 "." 符号操作数组内容

db.products.update(
   { _id: 100 },
   { $set:
      {
        "tags.1": "rain gear",
        "ratings.0.rating": 2
      }
   }
)

示例:创建不存在的 key 值

db.products.update(
   { _id: 100 },
   { $set:
      { "name": "not the name" }
   }
);

"$unset"

从文档中移除指定的键。若要完全删除键 “name” ,使用 “$unset” 即可:

db.products.update(
   { _id: 100 },
   { $unset:
      { "name": 1 }
   }
);

"$inc"

"$inc"修改器用来增加已有键的值,或者在键不存在时创建一个键。inc就是专门来增加(和减少)数字的。

"$inc"只能用于整数、长整数或双精度浮点数。要是用在其他类型的数据上就会导致操作失败。

"$inc" 可以接收正数或者负数的值。

示例:将 "quantity" 值减少 1

db.products.update(
   { _id: 100 },
   { $inc :
      { "quantity": -1 }
   }
);

"$rename"

$rename

// 语法: 
{ $rename: { <old name1>: <new name1>, <old name2>: <new name2>, ... } }

示例:修改 "sku" 为 "skuName"

db.products.update(
   { _id: 100 },
   { $rename :
      { "sku": "skuName" }
   }
);

"$pop"

只能用于对 数组(array)进行操作。用于移除数组第一个元素,或者用于移除数组的最后一个元素。

// 语法 -1 表示移除数组第一个元素, 1 表示移除数组最后一个元素
{ $pop: { <field>: <-1 | 1>, ... } }

首先插入数据(集合名称:students):

// 插入数据 
{ _id: 1, scores: [ 8, 9, 10 ] }

示例:移除第一个元素

db.students.update( { _id: 1 }, { $pop: { scores: -1 } } )

// 查询返回
{ _id: 1, scores: [ 9, 10 ] }

示例:移除最后一个元素

db.students.update( { _id: 1 }, { $pop: { scores: 1 } } ) 
// 查询返回 
{ _id: 1, scores: [ 9 ] }

"$push"

如果指定的键已经存在,会向已有的数组末尾加入一个元素,要是没有就会创建一个新的数组。

// 插入数据
{
    "_id" : 100.0,
    "details" : {
        "model" : "14Q3",
        "make" : "zzz"
    },
    "tags" : [ 
        "coats", 
        "outerwear", 
        "clothing"
    ],
    "sku" : "abc123"
}

示例: 向 tags 中增加一个元素

db.products.update( { _id: 100}, { $push: {tags: "push"} } ); 
// 返回结果 
{..."tags" : [ "coats", "outerwear", "clothing", "push"], ...}

示例:添加一个不存在的 key “name”

db.getCollection('products').update( {_id : 100}, {$push: { name : "sku" } } );

可以看到,push 只能对数组进行操作。

"$addToSet"

向集合数据中添加数组内容,如果数据存在就做追加操作,如果数据不存在就做新增 key 与内容操作。

// 语法 
{"$addToSet" : {成员: 内容} }

示例:向数据中的 name 字段追加内容(紧接着前面"$push"操作的数据来)

db.getCollection('products').update( {_id : 100}, { $addToSet : { name : "Name" } } );

示例:追加一个不存在的 key item (此时的操作和 $push 类似)

db.getCollection('products').update( {_id : 100}, { $addToSet : { item : "Name" } } );

$pull

// 语法
{ $pull: { <field1>: <value|condition>, <field2>: <value|condition>, ... } }

 pull操作符移除指定字段值为数组,且匹配pull操作符移除指定字段值为数组,且匹配pull语句声明的查询条件的所有元素。

示例:移除 tags 中的 “push” 与 coats 值

db.products.update(
    { _id : 100 },
    { $pull: { tags: { $in: [ "push", "coats" ] } } }
)

mongodb的update性能 mongodb update_mongodb的update性能

示例:移除 name 中的 “Name”

db.products.update( { _id : 100 }, { $pull: { name : "Name" } } )

mongodb的update性能 mongodb update_数组_02

findAndModify()

另外简单介绍下这个操作:

// 语法如下
db.collection.findAndModify({
    query: <document>,
    sort: <document>,
    remove: <boolean>,
    update: <document>,
    new: <boolean>,
    fields: <document>,
    upsert: <boolean>,
    bypassDocumentValidation: <boolean>,
    writeConcern: <document>,
    collation: <document>,
    arrayFilters: [ <filterdocument1>, ... ]
});

如果我们想对 某个数据进行全部修改,就可以使用 findAndModify() 方法:

db.products.findAndModify({
   query: { _id: 100},
   update: {
    "details" : {
        "model" : "14Q3",
        "make" : "zzz"
    },
    "tags" : [ 
        "coats", 
        "outerwear", 
        "clothing", 
        "push"
    ],
    "sku" : "abc123"
   }
});