通过findAndModify进行线性化读取
最后更新于
从复制集读取数据时,可能会读取过时(即可能并不能反映所有写道,发生前读操作)或不持久(即数据可能反映了写的状态还没有得到多数或复制集成员因此可以回滚)的数据,这取决于所使用的读取关注点。
从3.4版本开始,MongoDB引入了[可线性化](
本教程概述了一个替代过程,对于使用MongoDB 3.2的部署,该过程使用来读取不过时且不能回滚的数据。对于MongoDB 3.4,尽管可以应用概述的过程,但请参阅[“线性化”]([
此过程用于读取不过期且无法回滚的数据。为此,该过程使用具有的方法来修改文档中的伪字段。具体来说,该过程要求:
使用完全匹配查询,并且必须存在 才能满足该查询。
必须实际修改文档;即导致文档更改。
必须使用写关注 。[{ w: "majority" }
](")
[warning] 重要
“仲裁读取”过程比单纯使用读取问题要花费大量成本,[
"majority"
](
本教程从名为products的集合中读取内容。使用以下操作初始化集合。
本教程将在sku
现场使用完全匹配。这样,在sku
字段上创建唯一索引。
findAndModify
读取提交的数据。译者:杨帅
校对:杨帅
该集合中的文档包含一个虚拟字段_dummy_field
,该字段 在本教程中将通过递增 。如果该字段不存在,则该操作会将字段添加到文档中。该字段的目的是确保对文档进行修改。
在将用于指定操作中完全匹配的字段上创建唯一索引。
使用该方法对要阅读的文档进行简单更新,然后返回修改后的文档。需要写关注。要指定要阅读的文档,必须使用唯一索引支持的完全匹配查询。[{ w: "majority" }
](")
下面的操作在唯一索引的字段sku
上指定精确匹配,并增加匹配文档中名为_dummy_field
的字段。虽然不是必需的,但该命令的写操作还包括一个5000毫秒的值,以防止在写操作不能传播到大多数投票成员时永远阻塞操作。
即使在副本集中的两个节点认为它们是主节点的情况下,也只有一个节点能够用[w: "majority"
](
由于仲裁读取过程只会增加文档中的虚拟字段,因此您可以安全地重复调用 ,根据需要调整 。