2012-04-19 2 views
8

фон: Я быть_наст везет над приложением (оригинал инженер выезжает), которые действуют как кэширование слой некоторыхов относительно медленных услуг серверных. Поскольку это URL-адрес стиля RESTful, каждый URL-адрес уникален. Приложение использует MongoDb в качестве хранилища для кеша и использует хэш-значение в качестве кеша. Хотя хеш-код должен быть довольно уникальным, но он не уникален.Есть ли ограничение на длину _id в MongoDB

Вопрос: Мне сказали, что причина использовать хеш-код (вместо URL-адреса) заключалась в том, что поле _id MongoDb имеет ограничение по длине, но я не могу найти на нем какой-либо документ. Все, что я могу найти в документации MongoDb, это «поле _id может быть чем угодно, кроме массива, пока оно уникально». Верно ли, что поле _id MongoDb имеет ограничение по длине? Если да, то какой размер лимита?

Приложение написано на Java. О, и я новичок в MongoDb.

ответ

11

Существует ограничение на длину поля для индексации, которое составляет 1024 байта. Это ограничение размера индекса, а не размера поля документа, которое ограничено размером ~ 16 МБ (максимальный размер полного документа).

По соображениям производительности вам не нужны большие значения полей для индексированных полей, поскольку сравнения с такими большими значениями значительно медленнее. Также помните, что каждый индекс поддерживает копии индексируемых значений, поэтому для этого потребуется значительная часть памяти. Это по очереди означает более частый доступ к диску для обмена виртуальными страницами памяти в и из памяти, что опять-таки негативно сказывается на производительности.

Да, это ограничение ограничено 800 байт.

+0

Ах, спасибо. Да длинное строковое значение в _id тоже неудобно. Реальное решение заключается в обработке столкновений, но это и вся другая история. – Alvin

+0

Ну по своей природе хеш-значения редко могут быть уникальными. Поэтому я не буду хранить хеши как _id-значения (которые должны быть уникальными), и проверка столкновений не требуется. При этом было бы вполне возможно создать сокращенные URL-адреса для ваших URI REST, это просто потребует некоторой информации об использовании вашего кода сокращения. –

+0

Спасибо за совет! Ценить это. – Alvin

3

Конфликты хеширования должны быть редкими, если вы используете хорошую хеш-функцию с достаточно длинным значением хэша. Например, если ваш хеш выводит 128-битное значение, вы, как правило, получаете столкновение после создания 2^64 хэшей, поэтому, если вы производят миллион хэшей в секунду, вы получите столкновение примерно через 600 000 лет. Это, вероятно, достаточно хорошо для большинства целей.

Смежные вопросы