如何在mongodb中进行散列分片键工作?

时间:2013-08-26 09:02:30

标签: mongodb hash

我想知道mongodb中散列分片键的内部结构是什么。如果mongodb是一个时间戳,那么mongodb选择对我的字段进行哈希的常量是什么? 我想密钥将是时间戳%N;什么是N?
如果这是设计,我猜N不能随时间改变。我怎么能确定如果我有很多数据,如果N太小,1个碎片中不会有太多的碰撞?
感谢

1 个答案:

答案 0 :(得分:1)

散列键使用文档中的数据和标准散列函数(MD5)来生成文档的散列值。例如,假设您的索引位于{name: 'hashed'}并且您拥有以下文档:

{name: 'John', height: 73}
{name: 'Zardosht', height: 68}

MongoDB将通过MD5哈希函数运行'John''Zardosht',并获得随机字节序列。然后,它将使用这些字节序列作为索引中使用的实际B树密钥。当你想对{name: 'John'}进行查询时,它会再次执行MD5哈希,得到之前得到的相同字节序列,然后实际对该值进行索引查找。

你可以玩mongo shell,实际上看看这些值对你自己来说是什么:

 % mongodb-linux-x86_64-2.2.5/bin/mongo                 
MongoDB shell version: 2.2.5
connecting to: test
> db.runCommand({_hashBSONElement: {name: "John"}})
{
    "key" : {
        "name" : "John"
    },
    "seed" : 0,
    "out" : NumberLong("5553133884637223031"),
    "ok" : 1
}
> db.runCommand({_hashBSONElement: {name: "Zardosht"}})
{
    "key" : {
        "name" : "Zardosht"
    },
    "seed" : 0,
    "out" : NumberLong("8641066842148283865"),
    "ok" : 1
}

请注意,我所描述的内容中没有N,所以您不必担心这样的限制。