MongoDB笔记0x03

3.3 更新文档

更新update()可以接收两个参数,一个是查询条件,即需要修改哪个文档;另一个是需修改的内容。更新操作时不可分割的。如果有两个更新同时发生,则请求先到达服务器的先执行。系统则会保留最后的更新。update的第三个参数是upsert,类型为布尔值,为true则在查询过程中若没有找到符合条件的文档时会进行创建。第四个参数是是否修改查询得到的全部文档,默认为false,即只修改查询得到的第一个文档。

默认情况下,update中需修改的内容会被认为是替换原有文档,但是如果希望仅针对文档中的某键值修改的话,可以使用修改器,例如:


db.analytics.update(
  {"url": "www.example.com"},
  {"$inc": {"pageviews": 1}}
)

不同的修改器修改文档的速度是不同的。例如只修改值的$inc修改器修改速度很快,因为不需要改变文档大小。但是可以修改文档大小的——例如$set——就会比较慢,由于MongoDB是给每个文档固定长度的存储空间,如果文档变大进而不能再原先位置存储,还需要移动的磁盘上的其他位置。文档有一个填充因子的参数,用于文档大小的增长。如果一个文档多次因变大而在磁盘上移动,则该文档的填充因子同样会增长。

一个修改操作中不能含有多个修改器,例如在某个修改请求中同时含有$inc$set,这个请求就是非法的。

为防止多个线程/进程修改同一个文档而导致竞态,MongoDB提供了一个findAndModify方法,其查找和修改是原子操作,不会出现竞态。findAndModify不仅可以用于update,也可以用于remove

写入安全:分为应答式写入和非应答式写入。应答式写入是指客户端提出写入请求后等待服务端返回写入结果,非应答式写入则相反。

Author: SinLapis
Link: http://sinlapis.github.io/2017/10/24/MongoDB笔记0x03/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.