12

背景:正在接管一个应用程序(原始工程师离开),它充当一些相对较慢的后端服务的缓存层。因为它是 RESTful 风格的 URL,所以每个 URL 都是唯一的。应用程序使用 MongoDb 作为缓存的存储,并使用哈希值作为缓存。虽然哈希码应该是相当独特的,但它不是唯一的。

问题:有人告诉我使用哈希码(而不是 url)的原因是因为 MongoDb 的 _id 字段有长度限制,但我找不到任何文档。我在 MongoDb 文档中只能找到“_id 字段可以是数组以外的任何内容,只要它是唯一的”。MongoDb 的 _id 字段是否有长度限制?如果是这样,限制大小是多少?

该应用程序是用 Java 编写的。哦,我是 MongoDb 的新手。

4

2 回答 2

14

要索引的字段的长度有一个限制,即 1024 字节。这是对索引条目大小的限制,而不是限制在 ~16MB(完整文档的最大大小)的文档字段大小。

出于性能原因,您并不真正需要索引字段的大字段值,因为与这些大值的比较要慢得多。还要记住,每个索引都维护被索引的值的副本,因此它需要大量的内存。这反过来意味着更频繁的磁盘访问以在内存中交换虚拟内存页面,这再次对性能产生负面影响。

所以是的,限制为 800 字节。

于 2012-04-19T08:27:54.963 回答
4

如果您使用具有足够长的散列值的良好散列函数,散列冲突应该很少见。例如,如果你的哈希输出一个 128 位的值,你通常会在产生 2^64 个哈希后发生冲突——所以如果你每秒产生一百万个哈希,你会在大约 600,000 年后发生冲突。这对于大多数用途来说可能已经足够了。

于 2014-05-01T12:34:24.950 回答