MongoDB: Массовая вставка (Bulk.insert) vs insert multiple (insert ([...]))

Есть ли разница между объемной вставкой vs вставка нескольких документов?

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>
)

Есть ли это быстрее?

Ответ 1

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

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

Эта операция вернет BulkWriteResult, подробнее см. в документации .

Ответ 2

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

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