python的基础以及提高

MongoDB 之更新指令

2020-03-10  本文已影响0人  g_s_007
更新
db.questionnaire.update(
    # 更新条件
    {
        "project_id":"0"
    },
    # 更新内容 
    {
        $set:{
            "name":"问卷模板"
        }
    },
    # 更新方式 默认不写的话时更新一条
    {
        multi:true
    }
)

# $set 中可以是新增字段

  1. 在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);
  1. 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只能用于整型、长整型或双精度浮点型的值。不能使用字符串,数组或者其他非数字的值

> 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用来指定一个字段的值。如果这个字段不存在,则创建它。如果存在就修改.

$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"}})

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 在插入数组元素的时候避免重复数据

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]}}})
db.blog.update({"_id" : ObjectId("5c3c05c1541863c86371f966")},{$pop:{"mark":-1}}) # -1 是从数组的头部删除一个元素,1是从数组的末尾删除一个元素
 db.blog.update({"_id" : ObjectId("5c3c05c1541863c86371f966")},{$pull:{"mark":7}}) # 参数一是条件,参数二是需要删除的数组里的元素

如果数组的元素有多个重复的,比如[1,1,2,1],那么删除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 是一种特殊的更新,如果没有找到符合更新条件的文档,就会以这个条件和更新文档为基础创建一个新的文档。如果找到匹配的文档就正常更新。
update 的第三个参数表示这是个upsert 。

  1. 在已有文档中的添加字段
db.blog.update({"_id" : ObjectId("5c3c05c1541863c86371f966")},{$inc:{"nums":1}},true) # true 表示upsert 

这段代码更加高效而且是具有原子性的。

  1. 创建一个文档
db.blog.update({"paper":4},{$inc:{"paper":1}},true)

创建一个paper 为4的文档,然后加1,最后得到paper 为5的这样一条记录。

save 是一个shell函数,如果文档不存在,会自动创建文档,如果文档存在,会更新此文档,只有一个参数:文档。要是这个文档含有_id 键,save 会调用upsert,否则会调用insert。

data = {"paper":7} # insert
data = {"_id":ObjectId("5c4843339ae8548cce17c267"),"paper":8} # upsert 
db.blog.save(data) 
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 会自动加上并插入数据
上一篇 下一篇

猜你喜欢

热点阅读