2012-04-19 42 views
8

背景: I 正在接管作爲某些相對較慢後端服務的緩存層的應用程序(原始工程師正在離開)。由於它是REST風格的URL,每個URL都是唯一的。該應用程序使用MongoDb作爲緩存存儲,並使用散列值作爲緩存。雖然哈希碼應該是非常獨特的,但它不是唯一的。MongoDB中的_id長度是否有限制

問題:我被告知使用哈希碼(而不是url)的原因是因爲MongoDb的_id字段的長度有限制,但我找不到任何文檔。我在MongoDb文檔中找到的所有內容都是「_id字段只要是唯一的就可以是數組以外的任何其他字段」。 MongoDb的_id字段是否有長度限制?如果是這樣,限制尺寸是多少?

該應用程序是用Java編寫的。哦,我是MongoDb的新手。

回答

11

被索引字段的長度有一個限制,即1024字節。這是對索引條目大小的限制,而不是限制在〜16MB(完整文檔的最大大小)的文檔字段大小。

由於性能方面的原因,您不希望大字段值作爲索引字段,因爲與此類較大值進行比較會相當慢。還要記住,每個索引都會保留索引值的副本,因此需要大量的內存。這反過來意味着更頻繁的磁盤訪問來交換虛擬內存頁面內存和內存溢出,這同樣會對性能產生負面影響。

所以是的,限於800字節。

+0

啊,謝謝。 _id中的長字符串值也很尷尬。真正的解決辦法是處理碰撞,但這就是其他故事。 – Alvin 2012-04-19 08:44:42

+0

從本質上來說,哈希值很難保證是唯一的。因此,我不會將散列存儲爲_id值(這些值必須是唯一的),並且不應要求進行碰撞檢查。也就是說,爲您的REST URI創建縮短的URL應該是完全可能的,它只需要縮短代碼中的一些應用程序感知。 – 2012-04-19 08:58:22

+0

感謝您的建議!欣賞它。 – Alvin 2012-04-19 09:13:38

3

如果您使用散列值足夠長的散列函數,散列衝突應該很少見。例如,如果您的散列值輸出128位值,那麼在產生2^64散列值後通常會發生衝突 - 所以如果您每秒產生一百萬次散列值,則在大約60萬年後會發生碰撞。這對大多數目的來說可能已經足夠了。

相關問題