zoukankan      html  css  js  c++  java
  • Mongo中更新总结

    mongo中的更新其实也可以当做添加来使用

    mongo中跟新有几种方式

    save、update、upsert

    执行save的时候如果这个文档有_id这个参数,save 会调用 upsert,否则会调用 insert

    upsert修改速度要比update快

    使用upsert如果修改的这个数据不存在,则会创建一条新的数据

    各种修改器

    $inc 、 $set

    其中 $inc 只能修改数值类型的数据,修改别的类型的数据会报错

    db.ansheng.update({"aaaaa":20},{"$inc":{"aaaaa":-19}},true)           upsert
    db.ansheng.update({"aaaaa":20},{"$inc":{"aaaaa":-19}})             update
    db.ansheng.save({"_id" : ObjectId("5706032acd0a6194868cf53e"),"aaaaa":20})   save
    使用save的时候要注意save修改的时候,相当于把这个文档,给替换了。
    比如:上面的这个save语句,修改目标数据的时候只会修改aaaaa这个字段,别的字段都会给删掉
    使用save的时候如果前面的查询参数不是 _id ,他就会创建一个新的文档

    上面是三种最简单的修改,都是只修改一个字段

    用save 的时候会影响到别的字段

    用update和upsert就不会影响到别的字段

    数组的修改

    {
      "_id" : ObjectId("5706032acd0a6194868cf53e"),
      "aaaaa" : 20.0,
      "book" : ["在绝望中寻找希望", "C#大全", "Mongo权威指南"]
    }

    修改 book 中的数据

    db.ansheng.update({"aaaaa":20},{"$set":{"book.0":"干你妹三千"}},true)    通过数组的下标修改这个数组
    db.ansheng.update({"aaaaa":20},{"$set":{"book.0":"干你妹三千"}})       通过数组的下标修改这个数组
    db.ansheng.save({"_id" : ObjectId("5706032acd0a6194868cf53e"),"aaaaa":20,"book":["在绝望中寻找希望","C#大全","Mongo权威指南"]})  修改整个文档

    批量更新

    db.ansheng.update({"aaaaa" : 1},{"$set":{"book" : ["在绝望中寻找希望", "C#大全", "Mongo权威指南","干你妹三千"]}},true,true)

    update 的第四个参数是用来控制是否批量更新的。

    内嵌文档的修改

    {
      "_id" : ObjectId("5706032acd0a6194868cf53e"),
      "aaaaa" : 2.0,
      "book" : ["在绝望中寻找希望", "C#大全", "Mongo权威指南"],
      "list" : [{
          "name" : "乔安生",
          "age" : 23.0,
          "school" : "驻马店第一高级中学"
        }, {
          "name" : "张三",
          "age" : 18.0,
          "school" : "驻马店市第一初级学校"
        }]
    }

    现在有这么一个文档,对list中的数据进行一系列的操作

    db.ansheng.save({"_id" : ObjectId("5706032acd0a6194868cf53e"),"aaaaa":2,"book":["在绝望中寻找希望","C#大全","Mongo权威指南"],"list":[{"name":"乔安生","age":23,"school":"驻马店第一高级中学"},{"name":"张三","age":18,"school":"驻马店市第一初级学校"}]})

    总结

    save、update、upsert

    save只能进行整体的修改

    update和upsert都可以实现局部的修改(必须加上 $set 修改器,如果不加会修改文档中全部的数据)

    update修改的时候如果修改的内容相同则不会修改

    upsert不管相不相同都会修改

    因为update 修改的时候会先到数据库中查询一下,如果相同就不会修改,所以update 的效率就会比 upsert 低一点

    所以个人感觉

    upsert的效率最高

    update的效率其次

    save的效率最低

  • 相关阅读:
    Go语言string,int,int64 ,float转换
    Go 时间相关
    静态顺序表操作
    汇编基础
    C语言字节对齐
    BugkuCTF-游戏过关
    数组越界问题分析
    选择排序(Java)
    杨辉三角(C语言)
    二分查找(Java)
  • 原文地址:https://www.cnblogs.com/ansheng/p/5445821.html
Copyright © 2011-2022 走看看