MongoDB 之更新指令
2020-03-10 本文已影响0人
g_s_007
更新
- 简单更新:
db.questionnaire.update(
# 更新条件
{
"project_id":"0"
},
# 更新内容
{
$set:{
"name":"问卷模板"
}
},
# 更新方式 默认不写的话时更新一条
{
multi:true
}
)
# $set 中可以是新增字段
- 文档替换
- 在mongo shell 中执行js 代码:
var joe = db.user.findOne({"name" : "joe"});
joe.relationships = {"friends" : joe.friends, "enemies" : joe.enemies};
joe.username = joe.name;
delete joe.friends;
delete joe.enemies;
delete joe.name;
db.users.update({"name" : "joe"}, joe);
- python 中使用pymongo
import pymongo
client = pymongo.MongoClient()
def update_user(client):
coll = client["foobar"]["user"]
user = coll.find_one({"name": "jim"})
relationships = {"friends": user.get("friends"), "enemies": user.get("enemies")}
coll.update_one({"name": "jim"},
{"$set": {"relationships": relationships}, "$unset": {"friends": "", "enemies": ""}})
update_user(client)
- 修改器 $inc
指定对文档中的某些字段进行更新,如果没有就创建,有的话,就在原有基数上加上相应的值
更新修改器是种特殊的键,用来指定复杂的更新操作,比如修改、增加或者删除键,还可能是操作数组或者内嵌文档
注意:$inc只能用于整型、长整型或双精度浮点型的值。不能使用字符串,数组或者其他非数字的值
> db.games.insert({"game":"pinball","user":"joe"})
WriteResult({ "nInserted" : 1 })
> db.games.update({"game":"pinball"},{$inc:{"score":NumberInt(50)}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.games.find()
{ "_id" : ObjectId("5c45af5ee0c89b7a76db68ad"), "game" : "pinball", "user" : "joe", "score" : 50 }
> db.games.update({"game":"pinball"},{$inc:{"score":NumberInt(1000)}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.games.find()
{ "_id" : ObjectId("5c45af5ee0c89b7a76db68ad"), "game" : "pinball", "user" : "joe", "score" : 1050 }
>
- 修改器 $set
- 简单使用
$set用来指定一个字段的值。如果这个字段不存在,则创建它。如果存在就修改.
$unset用来删除一个字段以及对应的值:$unset:{"url":""} 或者 $unset:{"url":1}
2. $set 修改嵌套字段
"section_list" : [{"id" : "","answers" : [{"question_id" : "e8b90438afd3474608e259cba70e8867","data" : "10","video_score" : "lock","detail" : ""},{"question_id" : "326f68205a5b5f7df8abae835c6f788b","data" : [],"detail" : ""}]]
修改answers[0][data] = 10
>db.comments.update({"_id" :"8057400d-1d13-4cab-9eaf-6ec460e2eda6"},{$set:{"section_list.0.answers.0.data":"10"}})
-
数组修改器(非常有用)
-
$push: 如果数组已经存在,会向已有的数组末尾假如一个元素,如果没有就创建一个新的数组
> db.blog.find() > { "_id" : ObjectId("5c3c05c1541863c86371f966"), "title" : "My Blog Post", "content" : "Here's my blog post.", "date" : ISODate("2019-01-14T03:44:51.870Z"), "desc" : "" } > db.blog.update({"title" : "My Blog Post"},{"$push":{"comments":{"name":"joe","email":"333.@qq.com","content":"nice"}}}) > WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.blog.findOne() > { > "_id" : ObjectId("5c3c05c1541863c86371f966"), > "title" : "My Blog Post", > "content" : "Here's my blog post.", > "date" : ISODate("2019-01-14T03:44:51.870Z"), > "desc" : "", > "comments" : [ > { > "name" : "joe", > "email" : "333.@qq.com", > "content" : "nice" > } > ] > } # 继续添加一条评论的话,继续使用$push > db.blog.update({"title" : "My Blog Post"},{"$push":{"comments":{"name":"bob","email":"444@qq.com","content":"good"}}}) -
1.1 使用
$each子操作符可以一次push操作添加多个元素
db.blog.update({"_id":ObjectId("5c3c05c1541863c86371f966")},{$push:{"mark":{$each:[1,2,3]}}})
```
1.2 使用`$slice` 可以固定数组的最大长度,这样就可以得到一个最多包涵N个元素的数组,`$slice`的值必须是负整数
ps: 书本第124页find 应该为update
```
db.blog.update({"_id":ObjectId("5c3c05c1541863c86371f966")},{"$push" : {"mark" : {"$each" : [1,2,3,4,5,6,7,8,9,10,11],"$slice" : -10,$sort:{"rating":-1}}}})
# 只显示最后十个元素,按照rating 倒序排列
- 将数组作为数据集使用
$addToSet
使用$addToSet 在插入数组元素的时候避免重复数据
db.blog.update({"_id" : ObjectId("5c3c05c1541863c86371f966")},{$addToSet:{"mark":5}})
也可以和$each 结合一次插入多个数组元素
db.blog.update({"_id" : ObjectId("5c3c05c1541863c86371f966")},{$addToSet:{"mark":{$each:[4,5,6,7,8,9]}}})
- 删除元素
pull
-
$pop修改器,可以从数组的任何一端删除元素。
db.blog.update({"_id" : ObjectId("5c3c05c1541863c86371f966")},{$pop:{"mark":-1}}) # -1 是从数组的头部删除一个元素,1是从数组的末尾删除一个元素
-
$pull是可以根据特定条件删除元素.
db.blog.update({"_id" : ObjectId("5c3c05c1541863c86371f966")},{$pull:{"mark":7}}) # 参数一是条件,参数二是需要删除的数组里的元素
如果数组的元素有多个重复的,比如[1,1,2,1],那么删除1时,所有元素1都删除掉了。
- 基于位置的数组修改器
若数组有多个值,但是我们只想对数组中的某些元素修改操作呢?
- 方法一:
数组下标都是以0开头,我们可以使用下标直接作为键来选择元素。
db.blog.update({"_id" : ObjectId("5c3c05c1541863c86371f966")},{"$set":{"comments.1.name":"jim"}}) # 修改comments 中的第二个元素中的name 为jim
2.方法二:通过位置或者定位操作符:$
$ 只更新第一个匹配的元素
db.blog.update({"comments.name":"joe"},{"$set":{"comments.$.name":"yyyy"}}) # 更新名字为yyy
- upsert
upsert 是一种特殊的更新,如果没有找到符合更新条件的文档,就会以这个条件和更新文档为基础创建一个新的文档。如果找到匹配的文档就正常更新。
update 的第三个参数表示这是个upsert 。
- 在已有文档中的添加字段
db.blog.update({"_id" : ObjectId("5c3c05c1541863c86371f966")},{$inc:{"nums":1}},true) # true 表示upsert
这段代码更加高效而且是具有原子性的。
- 创建一个文档
db.blog.update({"paper":4},{$inc:{"paper":1}},true)
创建一个paper 为4的文档,然后加1,最后得到paper 为5的这样一条记录。
- save 函数
save 是一个shell函数,如果文档不存在,会自动创建文档,如果文档存在,会更新此文档,只有一个参数:文档。要是这个文档含有_id 键,save 会调用upsert,否则会调用insert。
data = {"paper":7} # insert
data = {"_id":ObjectId("5c4843339ae8548cce17c267"),"paper":8} # upsert
db.blog.save(data)
- findAndModify
db.runCommand({"findAndModify":"blog","query":{"title":"在冬天和奶奶一起晒太阳好听"},"update":{"$set":{"title":"在冬天和奶奶一起晒太阳"}}}) # 返回匹配结果并更新
db.runCommand({"findAndModify":"blog","query":{"title":"在冬天和奶奶一起晒太阳好听"},"remove":true}) # 返回匹配结果并删除
删除文档
# 默认符合条件的全部删除 删除一条使用:justOne
db.samples.remove(
# 删除条件
{
"name":"SRR1291030"
},
# 删除一条
{
justOne:true
}
)
# 清空集合下所有文档
db.samples.remove({})
# 如果清空整个集合使用drop会更快,但是drop的就是真的什么都么了
保存
# 自动判断_id是否存在,如果存在就更新,如果不存在就插入
db.samples.save({
"_id":"1",
"name":"samples"
})
# 如果没有_id,mongo 会自动加上并插入数据