Подтвердить что ты не робот

Как 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')}
  }
);


4b9b3361

Ответ 1

TBH, я думаю, что самое лучшее, что вы можете сделать, это сравнить его. Создайте некоторые фиктивные данные и проверьте производительность при увеличении количества элементов в массиве. Может быть, быстрее выбить тест в вашей среде - чем ждать ответа здесь.

Это одна вещь в моем списке TODO, чтобы исследовать и вести блог, но я еще не обходил ее. Если вы это сделаете, мне определенно будет интересно узнать, что вы на самом деле делаете! Точно так же, если я скоро приступлю к этому, я также опубликую результаты здесь.

Ответ 2

С выпуском mongo 2.4 вы можете использовать ограниченные массивы. На вставке вы можете указать mongo на $sort и $slice массив, чтобы сохранить его на фиксированной длине, исходя из ваших критериев (если вам не нужно бросать данные). Например, вы можете использовать это, чтобы сохранить последние N записей в журнале данных.

Ответ 3

Вы не заметите, когда достигнете предела размера документа, если вы не используете getLastError после каждого обновления. Обновление завершится неудачно, и сообщение будет записано в журнал базы данных. У меня есть анекдотические данные от моего локального оппонента о том, что Mongo, похоже, работает более интенсивно, когда происходит множество обновлений, из-за которых размер документа достигнут.

Я не знаю простого способа избежать этого, кроме проектирования вокруг него. Насколько я знаю, нет никакого способа условно нажать на список. Я видел здесь другие вопросы о SO, где люди пытались создавать списки фиксированного размера и т.д., Но никаких хороших решений не найдено.