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的效率最低

上一篇:Activity使用Serializable传递对象实例


下一篇:Maven多模块项目打包前的一些注意事项(打包失败)