3

有人可以向我解释一下Mongodb 线性化阅读关注文档的某些部分:

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

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

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

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

    它是可线性化的并且我无法阅读陈旧的内容吗?如果回答,是否意味着没有理由在唯一索引中未显示的字段的读取中使用线性化读取关注?

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

    它是可线性化的并且我无法阅读陈旧的内容吗?

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

    它是可线性化的并且我无法阅读陈旧的内容吗?

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

    它是可线性化的并且我无法阅读陈旧的内容吗?

4

1 回答 1

5

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

MongoDB v3.4 中引入的线性化读取关注,是为了确保应用程序总是从正确的(当前/合法的)主节点读取最新的数据。这意味着在网络分区期间,应用程序不会读取:

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

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

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

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

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

于 2018-01-28T23:52:06.050 回答