Как Mongo DB обрабатывает большое поле массива?
Я пытаюсь сохранить список ObjectIds в документе как поле массива.
Я понимаю, что у Mongo DB есть ограничение на размер 4 МБ для отдельных документов. Поэтому, учитывая длину ObjectId составляет 12 байт, документ должен иметь возможность обрабатывать более 300 000 записей в одном поле массива. (Сообщите мне, если расчет выключен).
Если количество записей в массиве приближается к этому пределу, какую производительность я могу ожидать? Особенно, когда поле индексируется? Какие-либо проблемы с памятью?
Типичные запросы будут выглядеть следующим образом:
Запрос одним значением
db.myCollection.find(
{
myObjectIds: ObjectId('47cc67093475061e3d95369d')
}
);
Запрос несколькими значениями
db.myCollection.find(
{
myObjectIds: {$in: [ObjectId('47cc67093475061e3d95369d'), ...]}
}
);
Добавить новое значение для нескольких документов
db.myCollection.update(
{
_id: {$in: [ObjectId('56cc67093475061e3d95369d'), ...]}
},
{
$addToSet: {myObjectIds: ObjectId('69cc67093475061e3d95369d')}
}
);
Ответы
Ответ 1
TBH, я думаю, что самое лучшее, что вы можете сделать, это сравнить его. Создайте некоторые фиктивные данные и проверьте производительность при увеличении количества элементов в массиве. Может быть, быстрее выбить тест в вашей среде - чем ждать ответа здесь.
Это одна вещь в моем списке TODO, чтобы исследовать и вести блог, но я еще не обходил ее. Если вы это сделаете, мне определенно будет интересно узнать, что вы на самом деле делаете! Точно так же, если я скоро приступлю к этому, я также опубликую результаты здесь.
Ответ 2
С выпуском mongo 2.4 вы можете использовать ограниченные массивы. На вставке вы можете указать mongo на $sort и $slice массив, чтобы сохранить его на фиксированной длине, исходя из ваших критериев (если вам не нужно бросать данные). Например, вы можете использовать это, чтобы сохранить последние N записей в журнале данных.
Ответ 3
Вы не заметите, когда достигнете предела размера документа, если вы не используете getLastError
после каждого обновления. Обновление завершится неудачно, и сообщение будет записано в журнал базы данных. У меня есть анекдотические данные от моего локального оппонента о том, что Mongo, похоже, работает более интенсивно, когда происходит множество обновлений, из-за которых размер документа достигнут.
Я не знаю простого способа избежать этого, кроме проектирования вокруг него. Насколько я знаю, нет никакого способа условно нажать на список. Я видел здесь другие вопросы о SO, где люди пытались создавать списки фиксированного размера и т.д., Но никаких хороших решений не найдено.