database - MongoDb 可线性化读取关注限制

标签 database mongodb mongodb-query database-administration linearization

有人可以向我解释一下 Mongodb linearizable read concern 的一部分吗?文档:

Linearizable read concern guarantees only apply if read operations specify a query filter that uniquely identifies a single document.

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

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

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

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

    /li>
  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);//返回 {_id:"someId", A:1}

    它是否可线性化并且我无法读取陈旧

最佳答案

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

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

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

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

Does it mean that i have to have unique index on fields that presented in query filter?

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

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

关于database - MongoDb 可线性化读取关注限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48315585/

相关文章:

sql - 返回所有值,包括 NULL

mongodb - 使用 shell 中的奇怪字符访问 MONGO 集合,第二部分

MongoDB 用户通知方案建议

javascript - 字符串操作和聚合

database - Mongo错误QueryExceededMemoryLimitNoDiskUseAllowed

MySQL 触发器检查具有可能的 NULL 值的现有行

javascript - 如何在登录时区分用户类型?

sql - ms-access 选择有问题的数据

node.js - 带有 ObjectID 引用的 RESTful Mongoose

javascript - 使用变量作为 find() 内投影的字段说明符