有人可以向我解释Mongodb 可线性化读取关注文档的某些部分吗:
可线性化读取关注保证仅在读取操作指定唯一标识单个文档的查询过滤器时适用。
这是否意味着我必须对查询过滤器中显示的字段具有唯一索引?
例如让我们回答 4 个问题:
我
test
在 A 字段上有没有唯一索引的集合。db.test.find({A:"someValue"}).readConcern("linearizable").maxTimeMS(10000)
它是可线性化的吗?我无法阅读陈旧的内容?如果回答是,是否意味着没有理由在唯一索引中未显示的文件读取中使用线性化读取关注?
我
test
在 A 字段上有唯一索引的集合。
db.test.ensureIndex({A:1}, {unique:true}); db.test.find({A:"someValue"}).readConcern("linearizable").maxTimeMS(10000);
它是可线性化的吗?我无法阅读陈旧的内容?
我
test
在 A 字段上有唯一索引的集合。
db.test.ensureIndex({A:1}, {unique:true}); db.test.find({A:"someValue", B:"someValue2"}) .readConcern("linearizable").maxTimeMS(10000);
它是可线性化的吗?我无法阅读陈旧的内容?
我
test
在 A 字段上有没有唯一索引的集合。但是 find 方法在结果中只返回一个文档。
db.test.find({A:"someValue"}).readConcern("linearizable").maxTimeMS(10000); //returned {_id:"someId", A:"someValue"}
它是可线性化的吗?我无法阅读陈旧的内容?
德米特里,
从 MongoDB v3.6 开始,MongoDB 仅支持对单个文档的线性化读取关注,因此文档的措辞。然而,这并不意味着您必须使用唯一索引运行查询,而是您必须确保您的查询只返回一个文档。当然,只有使用唯一索引(例如
_id
字段上的默认索引)的查询过滤器才会有所帮助,因为这将确保您的查询返回单个文档。在您的特定情况下,查询 #2 和 #3 可以强制执行线性化读取,并且不会返回陈旧的读取。
对于查询 #4,您还将获得可线性化的读取,假设查询仅返回一个文档(这是您的假设)。
对于查询#1,如果您的查询返回多个文档,则不能保证获得可线性化的读取,因此在这种情况下您确实可以获得陈旧的读取(并且您的集群恰好在查询命中旧主节点时被分区) .
请注意,该方法的查询语法
find()
意味着您在包含值等于 1 的 A 属性(作为双精度值)[以及查询 #3B
中的值属性)的文档中请求,而您的命令指定索引应该建立在属性之上。我希望您知道这一点,因为否则您的查询会有些混乱。1
ensureIndex({A:1})
A