MongoDb线性化读取关注限制

时间:2018-01-18 07:06:26

标签: database mongodb mongodb-query database-administration linearization

有人可以向我解释Mongodb linearizable read concern文档的某些部分:

  

线性化读取关注保证仅在读取操作指定唯一标识单个文档的查询过滤器时才适用。

这是否意味着我必须在查询过滤器中显示的字段上包含唯一索引

例如,让我们回答4个问题:

  1. 我在A字段上没有唯一索引的集合testdb.test.find({A:1}).readConcern("linearizable").maxTimeMS(10000)

    可线性化,我无法读取陈旧吗?如果回答,是否意味着没有理由在fileds的读取中使用线性化读取关注而不是在唯一索引中显示?

    < / LI>
  2. 我在A字段上有一个具有唯一索引的集合test db.test.ensureIndex({A:1}, {unique:true}); db.test.find({A:1}).readConcern("linearizable").maxTimeMS(10000);

    可线性化吗并且我无法陈旧阅读?

  3. 我在A字段上有一个具有唯一索引的集合test db.test.ensureIndex({A:1}, {unique:true}); db.test.find({A:1, B:1}).readConcern("linearizable").maxTimeMS(10000);

    可线性化吗并且我无法陈旧阅读?

  4. 我在A字段上没有唯一索引的集合test。但是find方法只返回一个文件。
    db.test.find({A:1}).readConcern("linearizable").maxTimeMS(10000); //returned {_id:"someId", A:1}

    可线性化吗并且我无法陈旧阅读?

1 个答案:

答案 0 :(得分:1)

分布式数据库概念可能很难理解,让我们在解决问题之前介绍一些背景知识。

MongoDB v3.4中引入的

Linearizable Read Concern是为了确保应用程序始终从正确(当前/合法)primary node中读取最新数据。这意味着在网络分区期间,应用程序将无法读取:

  • 陈旧数据,即可能无法反映在读取操作之前发生的所有写入,或
  • 未提交的数据,即数据的状态可能反映了多数人或副本集成员尚未确认的写入,因此可以回滚

由于在多个节点(即辅助节点)中跟踪多个状态(即传播,提交)的数据的复杂性,linearizable读取关注的保证仅适用于读取操作唯一标识单个文档。

  

这是否意味着我必须在查询过滤器中显示的字段上有唯一索引?

现在要解决您的问题,查询只需返回集合中的一个唯一文档。虽然使用唯一索引将有助于查询返回单个文档,但集合不必具有唯一索引。例如,使用_id指定查询过滤器。由于字段名_id保留用作主键;它的值必须在集合中是唯一的。

您可能还有兴趣阅读以下内容: