我想知道mongodb中散列分片键的内部结构是什么。如果mongodb是一个时间戳,那么mongodb选择对我的字段进行哈希的常量是什么?
我想密钥将是时间戳%N;什么是N?
如果这是设计,我猜N不能随时间改变。我怎么能确定如果我有很多数据,如果N太小,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
,所以您不必担心这样的限制。