MongoDb 可线性化的读取关注限制
MongoDb linearizable read concern restrictions
有人可以向我解释 Mongodb linearizable read concern 文档的某些部分吗:
Linearizable read concern guarantees only apply if read operations specify a query filter that uniquely identifies a single document.
这是否意味着我必须在查询过滤器中显示的字段上具有 唯一索引?
例如让我们回答 4 个问题:
我的集合 test
在 A 字段上没有唯一索引。 db.test.find({A:1}).readConcern("linearizable").maxTimeMS(10000)
是否 linearizable 而我无法阅读 stale?如果回答 yes,是否意味着没有理由使用 linearizable read concern in reads by fields that not presented in unique index?
我的集合 test
在 A 字段上具有唯一索引。
db.test.ensureIndex({A:1}, {unique:true});
db.test.find({A:1}).readConcern("linearizable").maxTimeMS(10000);
是否 linearizable 并且我无法读取 stale?
我的集合 test
在 A 字段上具有唯一索引。
db.test.ensureIndex({A:1}, {unique:true});
db.test.find({A:1, B:1}).readConcern("linearizable").maxTimeMS(10000);
是否 linearizable 并且我无法读取 stale?
我的集合 test
在 A 字段上没有唯一索引。但是 find 方法 return 结果只有一个文档。
db.test.find({A:1}).readConcern("linearizable").maxTimeMS(10000); //returned {_id:"someId", A:1}
是否 linearizable 并且我无法读取 stale?
分布式数据库的概念可能很难理解,让我们在解决问题之前介绍一些背景知识。
Linearizable Read Concern introduced in MongoDB v3.4, is to ensure applications are always reading the most up-to-date data from the correct (current/legitimate) primary node。这意味着在网络分区期间,应用程序不会读取:
- 陈旧数据,即可能无法反映在读取操作之前发生的所有写入,或者
- 未提交的数据,即数据的状态可能反映了尚未被大多数人或副本集成员确认的写入,因此可以回滚
由于在多个节点(即辅助节点)中跟踪多个状态(即传播、提交)的数据的复杂性,保证 linearizable
只读关注如果读取操作唯一标识单个文档,则适用。
Does it mean that i have to have unique index on fields that presented in query filter?
现在要解决您的问题,查询只需 return 集合中的一个唯一文档。集合不必具有唯一索引,尽管使用唯一索引将有助于查询 return 单个文档。例如,使用 _id
指定查询过滤器。由于字段名称 _id
保留用作主键;它的值在集合中必须是唯一的。
您可能也有兴趣阅读以下内容:
有人可以向我解释 Mongodb linearizable read concern 文档的某些部分吗:
Linearizable read concern guarantees only apply if read operations specify a query filter that uniquely identifies a single document.
这是否意味着我必须在查询过滤器中显示的字段上具有 唯一索引?
例如让我们回答 4 个问题:
我的集合
test
在 A 字段上没有唯一索引。db.test.find({A:1}).readConcern("linearizable").maxTimeMS(10000)
是否 linearizable 而我无法阅读 stale?如果回答 yes,是否意味着没有理由使用 linearizable read concern in reads by fields that not presented in unique index?
我的集合
test
在 A 字段上具有唯一索引。
db.test.ensureIndex({A:1}, {unique:true}); db.test.find({A:1}).readConcern("linearizable").maxTimeMS(10000);
是否 linearizable 并且我无法读取 stale?
我的集合
test
在 A 字段上具有唯一索引。
db.test.ensureIndex({A:1}, {unique:true}); db.test.find({A:1, B:1}).readConcern("linearizable").maxTimeMS(10000);
是否 linearizable 并且我无法读取 stale?
我的集合
test
在 A 字段上没有唯一索引。但是 find 方法 return 结果只有一个文档。
db.test.find({A:1}).readConcern("linearizable").maxTimeMS(10000); //returned {_id:"someId", A:1}
是否 linearizable 并且我无法读取 stale?
分布式数据库的概念可能很难理解,让我们在解决问题之前介绍一些背景知识。
Linearizable Read Concern introduced in MongoDB v3.4, is to ensure applications are always reading the most up-to-date data from the correct (current/legitimate) primary node。这意味着在网络分区期间,应用程序不会读取:
- 陈旧数据,即可能无法反映在读取操作之前发生的所有写入,或者
- 未提交的数据,即数据的状态可能反映了尚未被大多数人或副本集成员确认的写入,因此可以回滚
由于在多个节点(即辅助节点)中跟踪多个状态(即传播、提交)的数据的复杂性,保证 linearizable
只读关注如果读取操作唯一标识单个文档,则适用。
Does it mean that i have to have unique index on fields that presented in query filter?
现在要解决您的问题,查询只需 return 集合中的一个唯一文档。集合不必具有唯一索引,尽管使用唯一索引将有助于查询 return 单个文档。例如,使用 _id
指定查询过滤器。由于字段名称 _id
保留用作主键;它的值在集合中必须是唯一的。
您可能也有兴趣阅读以下内容: