目录
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" ] } } }
)
示例:移除 name 中的 “Name”
db.products.update( { _id : 100 }, { $pull: { name : "Name" } } )
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"
}
});