0

我想知道 mongodb 中散列分片键的内部结构是什么。例如,如果它是时间戳,mongodb 选择对我的字段进行哈希处理的常量是什么?
我猜关键是 timestamp % N ; 什么是 N?
如果这是设计,我猜 N 不能随时间改变。如果 N 太小,我如何确定如果我有大量数据,则 1 个分片中不会发生太多冲突?
谢谢

4

1 回答 1

1

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

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

MongoDB 将运行'John''Zardosht'通过 MD5 哈希函数并获得看起来随机的字节序列。然后,它将使用这些字节序列作为要在索引中使用的实际 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我所描述的任何内容都没有,因此您不必担心这样的限制。

于 2013-08-26T18:52:01.713 回答