2012-04-19 5 views
8

Hintergrund: I über eine Anwendung nehme (Original Ingenieur verlässt), die als Caching-Schicht einiger relativ langsame Backend-Services fungieren. Da es sich um eine URL im REST-Stil handelt, ist jede URL eindeutig. Die Anwendung verwendet MongoDb als Speicher für den Cache und verwendet den Hash-Wert als Cache. Obwohl der Hash-Code ziemlich einzigartig sein sollte, ist er nicht eindeutig.Gibt es eine Grenze für die Länge von _id in mongodb

Frage: Mir wurde gesagt, der Grund für die Verwendung von Hash-Code (anstelle der URL) war, weil MongoDb _id Feld hat Länge zu begrenzen, aber ich kann kein Dokument darüber finden. Alles, was ich in der MongoDb-Dokumentation finden kann, ist "_id Feld kann alles andere als Array sein, solange es einzigartig ist". Stimmt es, dass das _id-Feld von MongoDb eine Längenbeschränkung hat? Wenn ja, wie groß ist die Grenzgröße?

Die Anwendung ist in Java geschrieben. Oh, und ich bin neu in MongoDb.

Antwort

11

Die Länge des zu indizierenden Felds ist auf 1024 Byte beschränkt. Das ist eine Einschränkung für die Indexeintragsgröße und nicht für die Dokumentfeldgröße, die bei ~ 16 MB begrenzt sind (die maximale Größe eines vollständigen Dokuments).

Aus Leistungsgründen wollen Sie nicht wirklich große Feldwerte für indizierte Felder, da Vergleiche mit solchen großen Werten erheblich langsamer sind. Denken Sie auch daran, dass jeder Index Kopien der Werte enthält, die indiziert werden, so dass ein erheblicher Speicherbedarf besteht. Dies wiederum bedeutet einen häufigeren Plattenzugriff, um virtuelle Speicherseiten innerhalb und außerhalb des Speichers auszutauschen, was sich wiederum negativ auf die Leistung auswirkt.

Also ja, begrenzt auf 800 Bytes.

+0

Ah, danke. Ja lange Zeichenfolge Wert in _id ist auch peinlich. Die wirkliche Lösung ist die Kollision, aber das ist eine andere Geschichte. – Alvin

+0

Nun, Hash-Werte können aufgrund ihres Charakters selten garantiert einmalig sein. Daher würde ich keine Hashes als _id-Werte speichern (die eindeutig sein müssen), und eine Kollisionsprüfung sollte nicht erforderlich sein. Das heißt, es sollte durchaus möglich sein, verkürzte URLs für Ihre REST-URIs zu erstellen, es würde lediglich eine gewisse Anwendungssensitivität in Ihrem Verkürzungscode erfordern. –

+0

Danke für den Hinweis! Bin dankbar. – Alvin

3

Hash-Kollisionen sollten selten sein, wenn Sie eine gute Hash-Funktion mit einem ausreichend langen Hash-Wert verwenden. Wenn Ihr Hash beispielsweise einen 128-Bit-Wert ausgibt, erhalten Sie normalerweise eine Kollision, nachdem Sie 2^64 Hashes erzeugt haben. Wenn Sie also eine Million Hashes pro Sekunde erzeugen, erhalten Sie nach ungefähr 600.000 Jahren eine Kollision. Dies ist wahrscheinlich für die meisten Zwecke gut genug.

Verwandte Themen