MongoDb 可线性化读取关注限制

Dmi*_*Zyr 3 database linearization database-administration mongodb mongodb-query

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

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

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

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

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

    它是否可以线性化并且我无法读取过时?如果回答yes,是否意味着没有理由在未出现在唯一索引中的字段读取中使用线性化读取关注

  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}

    它是否可以线性化并且我无法读取过时

Wan*_*iar 5

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

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

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

由于跟踪多个状态数据的复杂性(即传播时,提交)的多个节点(即次级),该担保linearizable读取关注,如果读操作识别单个文件只适用。

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

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

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