2016-01-31 5 views
10

Есть ли разница между bulk insert и inserting multiple documents?MongoDB: Bulk insert (Bulk.insert) vs insert multiple (insert ([...]))

var bulk = db.items.initializeUnorderedBulkOp(); 
bulk.insert({ item: "abc123", defaultQty: 100, status: "A", points: 100 }); 
bulk.insert({ item: "ijk123", defaultQty: 200, status: "A", points: 200 }); 
bulk.insert({ item: "mop123", defaultQty: 0, status: "P", points: 0 }); 
bulk.execute(); 

VS

db.collection.insert(
    <document or array of documents> 
) 

Есть один Thats быстрее?

ответ

19

@ Dummy правильно, что массовые операции, как правило, быстрее, чем отдельные вставки, однако, начиная с версии 2.6 и выше, вставка нескольких документов с использованием collection.insert - это просто синтаксический сахар для BulkWrite. Если установить флаг ordered ложь, производительность должна быть идентична неупорядоченный массовой вставки:

db.collection.insert(<document array>,{ordered:false}) 

Эта операция возвращает BulkWriteResult, подробнее в documentation.

13

Да, есть разница. При использовании массивных опций (всегда) вам нужно только один раз войти в базу данных и выполнить операцию по партиям записей, после чего вы вернетесь в приложение. С отдельными вставками вам нужно будет перейти в базу данных, вставить, а затем вернуться к приложению, и вы повторите этот процесс для каждой отдельной операции вставки, которую вы укажете базе данных. Таким образом, отдельные вставки очень медленные по сравнению с массовыми операциями. Это похоже на покупки в бакалейных магазинах, если у вас есть все, что вам нужно для покупки, вы можете купить их в одной поездке (объемная вставка), но если для каждого элемента вам нужно доехать до магазина, чтобы получить его, а затем проехать домой, затем вернитесь в магазин, чтобы купить другой товар, тогда он не очень эффективен (например, отдельные вставки).

Примечание. Несмотря на то, что при взаимодействии с MongoDB, использующим оболочку, вам нужно иметь дело только с одной функцией insert для объемных и индивидуальных вставок, вы должны делать различие между insertOne() и insertMany() операциями при использовании API-интерфейсов драйвера MongoDB. И вы никогда не должны звонить insertOne() внутри цикла (причина: см. Аналогию с покупками в бакалейных магазинах выше).