> db.obj.update(
... { name: "obj2" },
... {
... f1: 1,
... f2: "a"
... }
... )
WriteResult({
"nMatched" : 1, "nUpserted" : 0,
"nModified" : 1 })
> db.obj.find({f1:1})
{ "_id" : ObjectId("5502a740773fc1f962baf14e"), "f1" : 1, "f2" : "a" }
$inc +=
$mul *
$rename 重命名字段
$setOnInsert 当设置了$upsert:true,并且的确新插入了文档时,设置新文档的属性。
$unset 删除字段
$min 只有当指定的值小于原有值时才更新
$max 只有当指定的值大于原有值时才更新
$currentDate 将字段的值设置为当前时间
修改子文档的名称和数组,并且添加一个字段lastModified,内容是当前时间
... { name: "obj1" },
... {
...
$set: {
... "subObj.subName": "sub-name-1",
... "subObj.subArr": ["a", "b"]
... },
... $currentDate: { lastModified: true }
... }
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.obj.findOne();
{
"_id" : ObjectId("5502a2ef773fc1f962baf14b"),
"name" : "obj1",
"arr" : [
{
"elemName" : "elem1",
"elemValue" : 1
},
{
"elemName" : "elem2",
"elemValue" : 2
}
],
"subObj" : {
"subName" : "
sub-name-1",
"subArr" : [
"
a",
"
b"
]
},
"lastModified" : ISODate("2015-03-13T08:55:27.802Z") }
update默认只能更改1个文档,不管匹配到多数据,最后只会显示 WriteResult({
"nMatched" : 1, "nUpserted" : 0,
"nModified" : 1 })
> db.obj.update(
... { name: {$regex: /bulk/} },
... {
... $set: {
... "subObj.subName": "sub-name-update",
... },
... $currentDate: { lastModified: true }
... },
...
{multi: true} ... )
WriteResult({
"nMatched" : 2, "nUpserted" : 0,
"nModified" : 2 })
> db.obj.update(
... { name: "xxx" },
... {
... name: "xxx",
... value: 123
... },
...
{ upsert: true } ... )
WriteResult({
"nMatched" : 0,
"nUpserted" : 1, "nModified" : 0,
"_id" : ObjectId("5502ab51fa04f5d70cc725c1") })
> db.obj.find({name: "xxx"});
{ "_id" : ObjectId("5502ab51fa04f5d70cc725c1"), "name" : "xxx", "value" : 123 }
> db.obj.update(
... { name: "yyy" },
... {
$set: {
... name: "yyy",
... value: 9
... }},
... {
upsert: true }
... )
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("5502acf6fa04f5d70cc725c2")
})
> db.obj.find({name: "yyy"})
{ "_id" : ObjectId("5502acf6fa04f5d70cc725c2"), "name" : "yyy", "value" : 9 }
> db.obj.find({name: "xxx"}, {_id:0});
{
"name" : "xxx", "value" : 123 }
更新为1000
> db.obj.update(
... { name: "xxx" },
... {
...
$set: {value: 1000}, ... $setOnInsert: {newDoc: true}
... },
... {
upsert: true }
... );
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.obj.find({name: "xxx"}, {_id: 0});
{ "name" : "xxx",
"value" : 1000 }
> db.obj.update(
... { name: "zzz" },
... {
... $set: {value: 1000},
...
$setOnInsert: {newDoc: true} ... },
... { upsert: true }
... );
WriteResult({
"nMatched" : 0,
"nUpserted" : 1,
"nModified" : 0,
"_id" : ObjectId("5502edf9ec6530e2da657454")
})
> db.obj.find({name: "zzz"}, {_id:0});
{ "name" : "zzz", "value" : 1000,
"newDoc" : true }
注意不能$set不能和$setOnInsert包含一样的属性,否则在新创建文档时会报错
> db.obj.update(
... { name: "zzz" },
... {
... $set: {
value: 1000},
... $setOnInsert: {
value: 2000}
... },
... { upsert: true }
... );
WriteResult({
"nMatched" : 0,
"nUpserted" : 0,
"nModified" : 0,
"writeError" : {
"code" : 16836,
"errmsg" : "
Cannot update 'value' and 'value' at the same time"
}
})
$ 更新从数组里取到的第一个元素。
$addToSet 如果数组里不包含这个元素,就添加元素。
$pop 移除数组的第一个或最后一个元素。-1表示移除第一个。1表示移除最后一个
$pullAll 从数组中移除所有匹配的值(指定多个值)。
$pull 从数组中移除所有匹配的值。
$pushAll 向数组添加多个值。
$push 向数组添加一个值。
> db.obj.update({name: "zzz"}, {name: "zzz", value: [1,2,3,4,5,6,7,8,9, "aaa", "aaa", "bbb", "bbb", "aa", "bb"]});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.obj.findOne({name: "zzz"});
{
"_id" : ObjectId("5502edf9ec6530e2da657454"),
"name" : "zzz",
"value" : [
1,
2,
3,
4,
5,
6,
7,
8,
9,
"aaa",
"aaa",
"bbb",
"bbb",
"aa",
"bb"
]
}
> db.obj.update(
... { name: "zzz" },
... {
$pull: { value : {
$regex: /a/} } }
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.obj.find({name: "zzz"})
{ "_id" : ObjectId("5502edf9ec6530e2da657454"), "name" : "zzz", "value" : [ 1, 2, 3, 4, 5, 6, 7, 8, 9, "bbb", "bbb", "bb" ] }
($pullAll后面的数组里只能是明确的值,不支持正则表达式)
> db.obj.update(
... { name: "zzz" },
... { $pull
All: { value :
["bbb", 3] } }
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.obj.find({name: "zzz"}, {_id:0});
{ "name" : "zzz", "value" : [ 1, 2, 4, 5, 6, 7, 8, 9, "aaa", "aaa", "aa", "bb" ] }
(1 查询选项里必须有数组元素的过滤条件, 2 "value.$"的双引号不能省略)
> db.obj.update(
... { name: "zzz",
value: "aaa" },
... { $set: {
"value.$" : "AAA" } }
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.obj.find({name: "zzz"}, {_id:0});
{ "name" : "zzz", "value" : [ 1, 2, 3, 4, 5, 6, 7, 8, 9, "
AAA", "aaa", "bbb", "bbb", "aa", "bb" ] }
> db.obj.update(
... { name: "zzz", value: "aaa" },
... {
...
$push: { value : {
$each: [100, 200, 300],
$position: 2} },
... }
... )
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.obj.find({name: "zzz"}, {_id:0});
{ "name" : "zzz", "value" : [ 1, 2,
100, 200, 300, 3, 4, 5, 6, 7, 8, 9, "aaa", "aaa", "bbb", "bbb", "aa", "bb" ] }
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26239116/viewspace-1485422/,如需转载,请注明出处,否则将追究法律责任。