请通过浏览器功能收藏网页

mongodb更新命令update使用 (1) mongodb

发布时间:2018-09-05 15:02:22  作者:本站编辑  来源:本站原创  浏览次数:
我有话说 | 分享 |
www.javainfo.com.cn 上干货 欢迎收藏


shell操作的内容, 以JSON格式组织, 这里只说明部分命令,更多命令请参考官网

 官网地址:https://docs.mongodb.com/manual/reference/operator/


插入数据  one item 

db.user.insert({"name":"newuser","age":88,"addr":"china tangshan "});

插入多条数据  two items or more 

db.user.insert([{"name":"newuser","age":88,"addr":"china tangshan "},{"name":"newuser2","age":22,"addr":"china qianxi "}]);

> db.user.find();

{ "_id" : ObjectId("5b8f33a9dfb2a160dbb01a84"), "name" : "newuser", "age" : 88, "addr" : "china tangshan " }

{ "_id" : ObjectId("5b8f33b5dfb2a160dbb01a85"), "name" : "newuser", "age" : 88, "addr" : "china tangshan " }

{ "_id" : ObjectId("5b8f33b5dfb2a160dbb01a86"), "name" : "newuser2", "age" : 22, "addr" : "china qianxi " }


删除某条记录 remove 命令

db.user.remove({"_id":ObjectId("5b8f33eedfb2a160dbb01a87")});

WriteResult({ "nRemoved" : 1 })    删除成功  一条记录删除


修改某条记录的某个字段 update 命令 【此更新命令是整个文档的替换,不会对单独字段进行处理】


如我们想修改记录的 age , name 字段, 正常的思路是 只需要修改这两个的值就可用了,我们来看看mongo里是什么效果

db.user.update({"_id":ObjectId("5b8f33a9dfb2a160dbb01a84")},{"age":23,"addr":"china lubei"});

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.user.find();

{ "_id" : ObjectId("5b8f33a9dfb2a160dbb01a84"), "age" : 23, "addr" : "china lubei" }   

我们发现这个文档的整体都被替换掉了   丢失了name属性 的值


所以我们修改某条记录的时候 需要将其他属性页要保留在修改语句中,如下

> db.user.update({"_id":ObjectId("5b8f33a9dfb2a160dbb01a84")},{"name":"newuser0","age":23,"addr":"china lubei"});

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.user.find();

{ "_id" : ObjectId("5b8f33a9dfb2a160dbb01a84"), "name" : "newuser0", "age" : 23, "addr" : "china lubei" }    结果是我们期望的

{ "_id" : ObjectId("5b8f33b5dfb2a160dbb01a85"), "name" : "newuser", "age" : 88, "addr" : "china tangshan " }

{ "_id" : ObjectId("5b8f33b5dfb2a160dbb01a86"), "name" : "newuser2", "age" : 22, "addr" : "china qianxi " }


mongo里如何创建collection(table)呢, 可用通过创建一条插入语句,系统就会自动为其生成相应的collection 如下, 脚本执行完毕后, 系统会在mydb里自动创建名字为

temp的集合(collection);


新建了一个表 temp  

 db.temp.find();

{ "_id" : ObjectId("5b8f3974dfb2a160dbb01a8c"), "name" : "www", "age" : 22, "addr" : "china tangshan lubei" }

{ "_id" : ObjectId("5b8f3983dfb2a160dbb01a8d"), "name" : "3111", "age" : 32, "addr" : "china tangshan lubei" }

{ "_id" : ObjectId("5b8f3995dfb2a160dbb01a8e"), "name" : "2111", "age" : 44, "addr" : "china tangshan" }

{ "_id" : ObjectId("5b8f39a6dfb2a160dbb01a8f"), "name" : "1111", "age" : 44, "addr" : "china" }


我们检测一下update的更新 多条数据的方式


db.temp.update({"age":44},{"addr":"china"},0,1);   更新多条数据  后面有两个参数, 0, 1 表示符合条件的都更新掉, 结果显示   更新失败 只允许在 $(修改器) 里进行操作。 

WriteResult({

        "nMatched" : 0,

        "nUpserted" : 0,

        "nModified" : 0,

        "writeError" : {

                "code" : 9,

                "errmsg" : "multi update only works with $ operators"

        }

})


1:$set :指定一个字段的值,如果字段不存在,会创建一个   (修改某个字段的值)

   db.temp.find();

{ "_id" : ObjectId("5b8f3974dfb2a160dbb01a8c"), "name" : "www", "age" : 22, "addr" : "china tangshan lubei" }

{ "_id" : ObjectId("5b8f3983dfb2a160dbb01a8d"), "name" : "3111", "age" : 32, "addr" : "china tangshan lubei" }

{ "_id" : ObjectId("5b8f3995dfb2a160dbb01a8e"), "name" : "1111", "age" : 66, "addr" : "china" }   修改的记录条目

{ "_id" : ObjectId("5b8f39a6dfb2a160dbb01a8f"), "name" : "1111", "age" : 44, "addr" : "china" }

> db.temp.update({"_id":ObjectId("5b8f3995dfb2a160dbb01a8e")},{"$set":{"age":22}},0,1);

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.temp.find();

{ "_id" : ObjectId("5b8f3974dfb2a160dbb01a8c"), "name" : "www", "age" : 22, "addr" : "china tangshan lubei" }

{ "_id" : ObjectId("5b8f3983dfb2a160dbb01a8d"), "name" : "3111", "age" : 32, "addr" : "china tangshan lubei" }

{ "_id" : ObjectId("5b8f3995dfb2a160dbb01a8e"), "name" : "1111", "age" : 22, "addr" : "china" }   修改成功ok

{ "_id" : ObjectId("5b8f39a6dfb2a160dbb01a8f"), "name" : "1111", "age" : 44, "addr" : "china" }

db.temp.update({"_id":ObjectId("5b8f3995dfb2a160dbb01a8e")},{"$set":{"age":33,"addr":"china new"}},0,1);  修改多个字段

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.temp.find();

{ "_id" : ObjectId("5b8f3974dfb2a160dbb01a8c"), "name" : "www", "age" : 22, "addr" : "china tangshan lubei" }

{ "_id" : ObjectId("5b8f3983dfb2a160dbb01a8d"), "name" : "3111", "age" : 32, "addr" : "china tangshan lubei" }

{ "_id" : ObjectId("5b8f3995dfb2a160dbb01a8e"), "name" : "1111", "age" : 33, "addr" : "china new" }    修改成功

修改多条记录 多个字段:  就是修改条件修改为自己的条件

2:$unset :删掉某个字段   

    db.temp.update({"_id":ObjectId("5b8f3995dfb2a160dbb01a8e")},{"$unset":{"age":true}},0,1);

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.temp.update({"_id":ObjectId("5b8f3995dfb2a160dbb01a8e")},{"$unset":{"age":1}},0,1);

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })

> db.temp.find();

{ "_id" : ObjectId("5b8f3974dfb2a160dbb01a8c"), "name" : "www", "age" : 22, "addr" : "china tangshan lubei" }

{ "_id" : ObjectId("5b8f3983dfb2a160dbb01a8d"), "name" : "3111", "age" : 32, "addr" : "china tangshan lubei" }

{ "_id" : ObjectId("5b8f3995dfb2a160dbb01a8e"), "name" : "1111", "addr" : "china new" }     修改成功

{ "_id" : ObjectId("5b8f39a6dfb2a160dbb01a8f"), "name" : "1111", "age" : 44, "addr" : "china" }

    

db.temp.update({"_id":ObjectId("5b8f3995dfb2a160dbb01a8e")},{"$set":{"age":21}});   删除字段后, 在新增加一个字段 age

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.temp.find();

{ "_id" : ObjectId("5b8f3974dfb2a160dbb01a8c"), "name" : "www", "age" : 22, "addr" : "china tangshan lubei" }

{ "_id" : ObjectId("5b8f3983dfb2a160dbb01a8d"), "name" : "3111", "age" : 32, "addr" : "china tangshan lubei" }

{ "_id" : ObjectId("5b8f3995dfb2a160dbb01a8e"), "name" : "1111", "addr" : "china new", "age" : 21 }   文档的age字段增加成功

{ "_id" : ObjectId("5b8f39a6dfb2a160dbb01a8f"), "name" : "1111", "age" : 44, "addr" : "china" }


3:$inc :用来增加已有键的值,如果字段不存在,会创建一个。只能用于整型、长整型、或双精度浮点型的值。

    db.temp.update({"_id":ObjectId("5b8f3995dfb2a160dbb01a8e")},{"$inc":{"age":1}});  增加1  其余数字 同样适用

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.temp.find();

{ "_id" : ObjectId("5b8f3995dfb2a160dbb01a8e"), "name" : "1111", "addr" : "china new", "age" : 23 }  修改后的结果

{ "_id" : ObjectId("5b8f39a6dfb2a160dbb01a8f"), "name" : "1111", "age" : 44, "addr" : "china" }

> db.temp.update({"_id":ObjectId("5b8f3995dfb2a160dbb01a8e")},{"$inc":{"age":2}});      age 增加2 

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.temp.find();

{ "_id" : ObjectId("5b8f3995dfb2a160dbb01a8e"), "name" : "1111", "addr" : "china new", "age" : 25 }  修改后的结果

{ "_id" : ObjectId("5b8f39a6dfb2a160dbb01a8f"), "name" : "1111", "age" : 44, "addr" : "china" }


4:$push:向已有数组的末尾加入一个元素,要是没有就新建一个数组

    新增一个 数组的字段  fenshu

    db.temp.update({"_id":ObjectId("5b8f3995dfb2a160dbb01a8e")},{"$set":{"fenshu":[76,77,88]}});   

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.temp.find();

{ "_id" : ObjectId("5b8f3995dfb2a160dbb01a8e"), "name" : "1111", "addr" : "china new", "age" : 25, "fenshu" : [ 76, 77, 88 ] }   字段增加成功

> db.temp.update({"_id":ObjectId("5b8f3995dfb2a160dbb01a8e")},{"$push":{"fenshu":100}});

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.temp.find();

在数组后面添加了一个100值

{ "_id" : ObjectId("5b8f3995dfb2a160dbb01a8e"), "name" : "1111", "addr" : "china new", "age" : 25, "fenshu" : [ 76, 77, 88, 100 ] }  



5:$each:通过一次$push来操作多个值

    db.temp.update({"_id":ObjectId("5b8f3995dfb2a160dbb01a8e")},{$push:{"fenshu":{$each:[44,65,55]}}});

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.temp.find();

     尾部增加了三个值

{ "_id" : ObjectId("5b8f3995dfb2a160dbb01a8e"), "name" : "1111", "addr" : "china new", "age" : 25, "fenshu" : [ 76, 77, 88, 100, 15, 54, 44, 65, 55 ] }


6:$slice:限制数组只包含最后加入的n个元素,其值为负整数  表示从最后面的数据里截取个数, 若是值是整数的话,表示从前面的数据开始截取个数  

    注意:不能只将$slice或者$sort与$push配合使用,且必须使用$each

    db.temp.update({"_id":ObjectId("5b8f3995dfb2a160dbb01a8e")},{$push:{"fenshu":{$each:[44,65,55],$slice:-4}}});

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.temp.find();

{ "_id" : ObjectId("5b8f3995dfb2a160dbb01a8e"), "name" : "1111", "addr" : "china new", "age" : 25, "fenshu" : [ 55, 44, 65, 55 ] }

slice 必须与each配合适用

保留原有数组值的 最后两个值

> db.temp.update({"_id":ObjectId("5b8f3995dfb2a160dbb01a8e")},{$push:{"fenshu":{$each:[],$slice:-2}}});

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.temp.find();

{ "_id" : ObjectId("5b8f3995dfb2a160dbb01a8e"), "name" : "1111", "addr" : "china new", "age" : 25, "fenshu" : [ 65, 55 ] }


7:$sort:对数组中的元素,按照指定的字段来对数据进行排序(1为升序,-1为降序),然后再按照slice删除。

    注意:不能只将$slice或者$sort与$push配合使用,且必须使用$each

原有数组增加值,值增加后,再排序

db.temp.update({"_id":ObjectId("5b8f3995dfb2a160dbb01a8e")},{$push:{"fenshu":{$each:[54,22,45,90],$sort:-1}}});

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.temp.find();

{ "_id" : ObjectId("5b8f3974dfb2a160dbb01a8c"), "name" : "www", "age" : 22, "addr" : "china tangshan lubei" }

{ "_id" : ObjectId("5b8f3983dfb2a160dbb01a8d"), "name" : "3111", "age" : 32, "addr" : "china tangshan lubei" }

{ "_id" : ObjectId("5b8f3995dfb2a160dbb01a8e"), "name" : "1111", "addr" : "china new", "age" : 25, "fenshu" : 

[ 90, 90, 90, 65, 55, 54, 54, 54, 45, 45, 45, 22, 22, 22 ] }

{ "_id" : ObjectId("5b8f39a6dfb2a160dbb01a8f"), "name" : "1111", "age" : 44, "addr" : "china" }

对原有数组的内容进行排序   each 的数组置空就可以了

      db.temp.update({"_id":ObjectId("5b8f3995dfb2a160dbb01a8e")},{$push:{"fenshu":{$each:[],$sort:-1}}});

> db.temp.find();

{ "_id" : ObjectId("5b8f3974dfb2a160dbb01a8c"), "name" : "www", "age" : 22, "addr" : "china tangshan lubei" }

{ "_id" : ObjectId("5b8f3983dfb2a160dbb01a8d"), "name" : "3111", "age" : 32, "addr" : "china tangshan lubei" }

{ "_id" : ObjectId("5b8f3995dfb2a160dbb01a8e"), "name" : "1111", "addr" : "china new", "age" : 25, "fenshu" :

[ 22, 22, 22, 45, 45, 45, 54, 54, 54, 55, 65, 90, 90, 90 ] }

 

倒叙排序后,在截取前6个 

db.temp.update({"_id":ObjectId("5b8f3995dfb2a160dbb01a8e")},{$push:{"fenshu":{$each:[222],$sort:-1,$slice:6}}});

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.temp.find();

{ "_id" : ObjectId("5b8f3974dfb2a160dbb01a8c"), "name" : "www", "age" : 22, "addr" : "china tangshan lubei" }

{ "_id" : ObjectId("5b8f3983dfb2a160dbb01a8d"), "name" : "3111", "age" : 32, "addr" : "china tangshan lubei" }

{ "_id" : ObjectId("5b8f3995dfb2a160dbb01a8e"), "name" : "1111", "addr" : "china new", "age" : 25, "fenshu" : [ 222, 54, 54, 54, 45, 45 ] } 

 

8:$ne:判断一个值是否在数组中,如果不在则添加进去   (注意:这是放在query查询语句里的)

   db.temp.update({"_id":ObjectId("5b8f3995dfb2a160dbb01a8e"),"fenshu":{$ne:6}},{$push:{"fenshu":6}});

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.temp.find();

{ "_id" : ObjectId("5b8f3995dfb2a160dbb01a8e"), "name" : "1111", "addr" : "china new", "age" : 25, "fenshu" : [ 222, 222, 54, 54, 54, 6 ] }


9:$addToSet:将数组作为数据集使用,以保证数组内的元素不会重复

     db.temp.update({"_id":ObjectId("5b8f3995dfb2a160dbb01a8e")},{$addToSet:{"fenshu":223}});

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })  修改成功 添加223值

> db.temp.find();

{ "_id" : ObjectId("5b8f3995dfb2a160dbb01a8e"), "name" : "1111", "addr" : "china new", "age" : 25, "fenshu" : [ 222, 222, 54, 54, 54, 6, 223 ] }

> db.temp.update({"_id":ObjectId("5b8f3995dfb2a160dbb01a8e")},{$addToSet:{"fenshu":223}});

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })  修改成功,修改0条


10:$pop :从数组一端删除元素,{$pop:{key:1}},从末尾删掉一个,   -1则从头部删除

     db.temp.update({"name":"1111"},{$pop:{"fenshu":1}});

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.temp.find();

{ "_id" : ObjectId("5b8f3995dfb2a160dbb01a8e"), "name" : "1111", "addr" : "china new", "fenshu" : [ 222, 222, 54, 54 ] }


> db.temp.update({"name":"1111"},{$pop:{"fenshu":-1}});

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.temp.find();

{ "_id" : ObjectId("5b8f3995dfb2a160dbb01a8e"), "name" : "1111", "addr" : "china new", "fenshu" : [ 222, 54, 54 ] }


11:$pull:按照条件来删除所有匹配的元素

{ "_id" : ObjectId("5b8f3995dfb2a160dbb01a8e"), "name" : "1111", "addr" : "china new", "fenshu" : [ 222, 54, 54 ] }

分数数组里 54值 全部删除

> db.temp.update({"name":"1111"},{$pull:{"fenshu":54}});

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.temp.find();

{ "_id" : ObjectId("5b8f3995dfb2a160dbb01a8e"), "name" : "1111", "addr" : "china new", "fenshu" : [ 222 ] }   删除成功  54全部剔除


12:$:用来修改数组中第一个匹配的元素  与 set 配合适用

    { "_id" : ObjectId("5b8f3995dfb2a160dbb01a8e"), "name" : "1111", "addr" : "china new", "fenshu" : [ 99, 54, 66, 42, 35, 42 ] }

     查找分数中有42的记录,并修改找到的第一个42值的位置 使用99替换掉

> db.temp.update({"fenshu":42},{$set:{"fenshu.$":99}});    

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.temp.find();

{ "_id" : ObjectId("5b8f3995dfb2a160dbb01a8e"), "name" : "1111", "addr" : "china new", "fenshu" : [ 99, 54, 66, 99, 35, 42 ] }


13 save方法  

保存到数据库的SAVE方法, 当不含有 _id 参数的时候,  系统会调用 insert 方法,并创建一个 _id值 保存到数据库 

> db.temp.save({item:"book",qty:55});

WriteResult({ "nInserted" : 1 })

> db.temp.find();

{ "_id" : ObjectId("5b8f6a75914cf734f786d9e1"), "item" : "book", "qty" : 55 }

当其含有 _id 的值的时候, 系统会判断 _id 是否存在 ,存在的话 执行更新,不存在的话执行 insert方法 并为其创建一个_id值 保存到数据库

> db.temp.save({ "_id" : ObjectId("5b8f6a75914cf734f786d9e1"),item:"boo4k",qty:11});

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.temp.find();

{ "_id" : ObjectId("5b8f6a75914cf734f786d9e1"), "item" : "boo4k", "qty" : 11 }

新增了一个字段的值

db.temp.save({ "_id" : ObjectId("5b8f6a75914cf734f786d9e1"),item:"boo4k",qty:11,fenshu:98});

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.temp.find();

{ "_id" : ObjectId("5b8f6a75914cf734f786d9e1"), "item" : "boo4k", "qty" : 11, "fenshu" : 98 }

 

 upsert   是update方法的第三个参数,默认为0 /false 

找到了符合条件的文档就更新,否则会以这个条件和更新文档来创建一个新文档。

指定update方法的第三个参数为true,可表示是upsert 更新多个文档


MongoDB默认只更新符合条件的第一个文档,要更新所有匹配的文档,把第4个参数设置为true。

注意:

1:只能用在$XXX的操作中

2:最好每次都显示的指定update的第4个参数,以防止服务器使用默认行为

db.collection.update({},{},0,1);


如有疑问 请留言 欢迎提供建议
  • 0

    开心

  • 0

    板砖

  • 0

    感动

  • 0

    有用

  • 0

    疑问

  • 0

    难过

  • 0

    无聊

  • 0

    震惊

评论已有 0