mongodb更新命令update使用 (1) mongodb
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 条