注:命令行中...代表可以续写的意思,不是重新写
1、简介
通常文档只有一部分需要更新,可以使用原子性的修改器,对某个字段进行更新。
比如,我要实时统计访问页面的总量,就可以通过原子性的修改器来完成。提前透漏这个修改器是“$inc”
注意:使用修改器时,"_id“值不能改变
2、"$set"修改器
”$set“用来指定一个字段的值,如果有这个字段就替换,如果没有就新增
例如:
最简单的应用:
还可以更换数据类型
删除某个字段$unset
遗留问题:unset后面写字段值得时候为什么写1?不过写对应他的值也是可以删除的
解决遗留问题:1代表全部
修改内嵌文档
3、$inc()用来增加已有键的值,如果该键不存在就新建一个(简单说这个东西就是个+),主要应用于整型,长整型,双浮点型的值
4、添加元素$push()
$push会向已有数组末尾加入一个元素
再加一个
5、$each用于操作比较复杂的数组操作,如果数组里面的元素只有一个,那就是相当于$push
6、$slice设定数组长度,值只能是负数,-10代表数组只包含最后加入的10个元素
7、$sort -1为倒叙,1位正序
8、$ne可以添加不重复的数据,如果存在则不添加如果不存在,则添加
9、$addToSet这种支持批量验证插入和$each搭配使用
10、$pop可以从数组的任何一段删除数据{"$pop":{"key":"-1"}}从头开始删,{"$pop":{"key":"1"}}从尾部开始删
11、$pull根据特定条件删除数据中的某一个元素
12、$inc在数组中的使用
13、$定位符,它只能定位一次,所以如果定位到多个地方,就只修改第一个
遗留问题:未实现成功
这个应该是有错误
14、$setOnInsert
创建文件的同时创建字段,并在之后的更新中这个字段的值都不会再改变
总结:
修改器在不修改文档大小时候的操作速度会很快,但是一旦涉及文档大小更改就会影响性能,比如inc就不回影响文档大小
没移动一次文档,就会增加集合的填充因子(增加空白空间),这个增加很多填充因子肯定是不好的。
如果操作在插入和删除时会进行大量的移动和打乱数据,就是用usePowerOf2Sizes提高磁盘的复用率
db.runCommand({"collMod":CollectionName,"usePowerOf2Sizes":true})
这种方法只适用于经常需要打乱数据的集合上使用,在只进行插入或原地更新的集合上使用会降低效率。这个只会影响设置之后新分配的数据