假设集合“coll”有一个索引

{ts : 1, X : 1 , Y : 1}

为什么T,X和Y是长型的。
集合配置为在ts,x上分片
您能帮助我理解以下查询将如何执行吗?
1)无边界范围:以下查询是仅针对那些托管范围ts>100000000的碎片,还是全局查询?
db.coll.find({ts : {$gt : 100000000}})

2)有界范围:如果是的话,这个是目标范围还是全局范围?mongos足够聪明来解析查询吗?
db.coll.find({$and : [{ts : {$gt : 100000000}}, {ts : {$lte : 110000000}}]})

3)最后——在多个有界范围内会发生什么情况:
db.coll.find({$or : [[{$and : [{ts : {$gt : 100000000}}, {ts : {$lte : 110000000}}]}, {$and : [{ts : {$gt : 500000000}}, {ts : {$lte : 510000000}}]}]]})

我在http://www.mongodb.org/display/DOCS/Sharding+Introduction上找不到范围查询的任何引用…!
提前谢谢!

最佳答案

将只命中那些包含可能符合您的范围标准的文档的碎片。mongos之所以能够确定这一点,是因为您查询shard密钥,从而知道哪些是合格的。对invidual shard的查询是并行执行的。
与1)相同。mongos足够聪明,可以知道为此要命中哪些块。
$或中的每个条款都将单独评估。如果子句解析为完全相同的查询计划和块区域,则它们将/应该组合在一起。您可以通过在sharded环境中对查询运行explain()来检查这一点,并关注返回的信息。如果它包含一个“子句”对象,则表示不是$中的所有子句,或者可以使用相同的查询执行计划。
这是理论,但mongos的查询计划往往有点不一致。例如,使用一个“ts”shard key,在两个shard中的每一个shard中分别保存一个minkey-50和另一个51 maxkey,这个查询

{$or:[{$and:[{ts:{$gt:90}}, {ts:{$lt:100}}]}, {$and:[{ts:{$gt:91}}, {ts:{$lt:100}}]}]}

将正确解析为对第二个块的单个查询。但是这个(注意第二条中的90而不是91)
{$or:[{$and:[{ts:{$gt:90}}, {ts:{$lt:100}}]}, {$and:[{ts:{$gt:90}}, {ts:{$lt:100}}]}]}

实际上会导致对两个shard的查询,这没有什么意义,因为您基本上是要求它对$或两个完全相同的子句进行查询。基本上,尝试使用explain()和其他监视工具来查看查询在分片环境中的行为,以确保它按预期工作。

关于mongodb - mongos/智能路由,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8260843/

10-09 20:16