对散列密钥进行分片的集合的错误

时间:2014-07-11 13:21:17

标签: mongodb mongodb-query sharding

在分片集合中查询大量数据时,我们通过并行查询分片获益良多。 以下问题仅发生在通过哈希键分片的集合中。

在Mongo 2.4中,可以使用哈希边界进行查询,以获取一个块的所有数据。

我们使用了来自this post的查询。 这是一个范围查询,其哈希值为边界:

db.collection.find(
{ "_id" : { "$gte" : -9219144072535768301, 
             "$lt" : -9214747938866076750}
}).hint({ "_id" : "hashed"})

同样的查询也适用于2.6,但需要很长时间。

explain()显示它正在使用索引,但扫描的对象是通向高的。

"cursor" : "BtreeCursor _id_hashed",

此外,边界是错误的。

"indexBounds" : {
                "_id" : [
                    [
                        {
                            "$minElement" : 1
                        },
                        {
                            "$maxElement" : 1
                        }
                    ]
                ]
            },

2.4 t0 2.6是否有一些重大变化打破了这个查询? 即使边界被解释为非哈希值,为什么需要这么长时间?

是否有其他方法可以获取一个块或哈希索引范围的所有文档?

mongo internal hadoop connector也有分片集合的问题。

谢谢!

1 个答案:

答案 0 :(得分:1)

上面的查询工作在2.4中是不受支持的行为。请参阅SERVER-14557,其中包含类似的投诉以及如何正确执行此查询的说明。重新格式化正确的行为,您的查询变为:

db.collection.find().min({ _id : -9219144072535768301}).max({ _id : -9214747938866076750}).hint({_id : "hashed"})

正如SERVER票证中所报告的,还有一个错误(SERVER-14400)阻止此查询针对单个分片。目前还没有计划在2.6中解决。但是,这应该可以防止您在2.6下看到的表扫描,并允许更有效的检索。