散列切分键在mongodb中如何工作?
我想知道mongodb中散列切分键的内部结构是什么。例如,如果是时间戳,mongodb选择散列我的字段的常量是什么?散列切分键在mongodb中如何工作?,mongodb,hash,Mongodb,Hash,我想知道mongodb中散列切分键的内部结构是什么。例如,如果是时间戳,mongodb选择散列我的字段的常量是什么? 我猜密钥将是时间戳%N;什么是N? 如果这是设计,我猜N不能随时间而改变。如果N太小,我如何确保如果我有大量数据,那么在1个碎片中不会有太多的冲突 感谢散列键使用文档中的数据,并使用标准散列函数(MD5)为文档生成散列值。例如,假设您的索引位于{name:'hashed'}上,并且您有以下文档: {name: 'John', height: 73} {name: 'Zardosh
我猜密钥将是时间戳%N;什么是N?
如果这是设计,我猜N不能随时间而改变。如果N太小,我如何确保如果我有大量数据,那么在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
,因此您不必担心这样的限制。它将md5键,并使用md5的一部分存储在索引中,不记得确切的内容,源代码会说