Как Mongo DB обрабатывает большое поле массива? - PullRequest
11 голосов
/ 15 марта 2011

Я пытаюсь сохранить список 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')}
  }
);

Ответы [ 3 ]

5 голосов
/ 06 мая 2013

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

5 голосов
/ 15 марта 2011

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

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

2 голосов
/ 15 марта 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...