2012-05-02 4 views
1

Я не уверен, как это выразить. Ну, недавно я работал над проектом rails с mongoid, и у меня была задача вставить несколько записей в Mongodb.Mongoid create vs collection.insert

Вставьте несколько записей PartPriceRecord в базу данных. После этого я прибегая к помощи наткнулся на collection.insert команды:

PartPriceRecord.collection.insert (multiple_part_price_records)

Но вставляя большое количество записей, MongoDb всегда казалось, подсказывают мне с ошибкой сообщение:

Exceded максимальный размер вставки из 16,000,000 байт

G oogling вокруг, я обнаружил, что верхний предел для MongoDb для одного документа, но на удивление, когда я изменил выше запрос к этому:

multiple_part_price_records.each do|mppr| 
    PartPriceRecord.create(mppr) 
end 

вышеуказанные ошибки, кажется, не появляются больше.

Может ли кто-нибудь объяснить глубину под капотом, что же такое разница между ними?

Благодаря

ответ

4

Максимальный размер одного, массовой вставки 16м байт. Это то, что вы пытаетесь сделать в первом примере.

В вашем втором примере вы вставляете каждый документ отдельно. Поэтому каждая вставка находится под максимальным пределом для вставки.

+0

это значит создать команду, создать создать отдельный документ каждый раз, когда не знал, что – Viren

+0

Тогда как достичь массы вставки, как и выше, не приводя 16М байтов ошибки из MongoDB – Viren

+0

Чтобы сделать массивную вставку, вам нужно уменьшите количество документов, которые вы вставляете. –

3

@Kyle объяснил разницу в своем ответе весьма лаконично (+ +1), а также для решения вашей проблемы, вы можете захотеть взглянуть на делать пакетные вставки:

BATCH_SIZE = 200 
multiple_part_price_records.each_slice(BATCH_SIZE) do |batch| 
    PartPriceRecord.collection.insert(batch) 
end 

Это Нарезать записи в партии по 200 (или любой другой размер лучше всего подходит для вашей ситуации) и вставлять их в пределах этого предела. Это будет лот быстрее, чем бег, сохраняемый на каждом из них, который будет отправлять больше запросов в базу данных.

Несколько быстрых вещей, чтобы отметить о collection.insert:

  • Это не пробег валидация на вашей модели перед вставкой, вы можете проверить это до вставки
  • Требуется быть в формате документа, в отличие от сохранения, которое требует, чтобы оно было моделью. Вы можете легко конвертировать в документ, вызывая as_document на модели.
+0

Я думаю, что правильная функция 'as_document'. По крайней мере, 'to_document' дал мне ошибку' undefined method'. Благодарю. – Fredrik

+0

Спасибо @Fredrik, я исправил ответ;) – Jay

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