博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mongodb dml
阅读量:2432 次
发布时间:2019-05-10

本文共 5277 字,大约阅读时间需要 17 分钟。

覆盖整个文档
> 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" }
修改指定内容
更新操作支持的选项
$set          设置字段的值
$inc          +=
$mul          *
$rename       重命名字段
$setOnInsert  当设置了$upsert:true,并且的确新插入了文档时,设置新文档的属性。
$unset        删除字段
$min          只有当指定的值小于原有值时才更新
$max          只有当指定的值大于原有值时才更新
$currentDate  将字段的值设置为当前时间
修改子文档的名称和数组,并且添加一个字段lastModified,内容是当前时间
> db.obj.update(
...     { 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 })
要修改多个文档,需要用第3个参数:
> 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 }
也可以用$set
> 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  }
如果创建了新文档,设置newDoc属性为true
> 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"
        ]
}
把包含a的都移除
> 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" ] }
把包含bbb的,和3移除
($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" ] }
修改第一个匹配aaa的元素,改成AAA
(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" ] }
用$push在
指定位置上插入
多个
> 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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26239116/viewspace-1485422/

你可能感兴趣的文章
Python 爬取 13966 条运维招聘信息,这些岗位最吃香
查看>>
以太坊创始人V 神:普通人看见现在,天才看见未来
查看>>
Google 排名第一的语言,引数十万人关注:搞定它,技术大牛都甘拜下风
查看>>
软件开发行业,年轻与大龄程序员的生存现状
查看>>
打开数“智”化之门,一字之差带来的思考
查看>>
张一鸣无圈胜破圈?
查看>>
干货! AI 推断解决方案栈 Vitis AI 全流程独家解析
查看>>
麒麟信安面向场景化创新,赋能openEuler商业验证
查看>>
3 年培养 10 万“码农”,郑州推出“码农计划”
查看>>
去年我年薪 30W,今年我一天做 3 顿饭
查看>>
入职大厂,我容易吗?
查看>>
漫画:什么是加密算法?
查看>>
程序员是如何运用增长思维找到女朋友?
查看>>
“离开360时,它只给了我一块钱”
查看>>
漫话:如何给女朋友解释什么是RPC
查看>>
如何从零开始两天撸一个微信小程序?!(内含源码)
查看>>
女神?御姐?文艺?这样的程序媛你绝没见过! | 程序员有话说
查看>>
“软件外包城”下的马鞍山 | 程序员有话说
查看>>
程序员如何实现财富自由?
查看>>
你我的父母,都在被互联网“割韭菜”
查看>>