2016-01-31 20 views
10

bulk insertinserting multiple documentsの間に違いはありますか?MongoDB:一括挿入(Bulk.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つのザッツ速くはありますか?

答えて

19

@Dummyは一般的に個々の挿入よりも高速ですが、バージョン2.6以降ではcollection.insertを使用して複数のドキュメントを挿入すると、BulkWriteの構文的な砂糖にすぎません。あなたがfalseにorderedフラグを設定すると、パフォーマンスが順不同一括挿入と同一である必要があります:

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

この操作は、BulkWriteResultを返すdocumentationに詳細が表示されます。

13

はい、違いがあります。バルクオプション(常に)では、データベースに一度だけアクセスし、バッチのレコードに対して操作を実行してからアプリケーションに戻ります。個々のインサートでは、データベースにアクセスし、インサートを実行してからアプリケーションに戻って、データベースに実行を指示する1回の挿入操作ごとにこのプロセスを繰り返す必要があります。したがって、個々のインサートはバルク操作に比べて非常に遅いです。食料品買い物のようなものですが、買い物に必要なものがすべてある場合は、1回の旅行(一括挿入)でそれらをすべて購入できますが、各商品ごとに店舗に移動して購入する必要があります(個別のインサートのように)

注:シェルを使用してMongoDBとやり取りするときは、1つのinsert関数を処理する必要がありますバルク挿入と個別挿入の場合、MongoDBドライバーAPIを使用する場合は、insertOne()insertMany()の操作を区別する必要があります。そして、あなたは決してinsertOne()をループの中で呼ぶべきではありません(理由:上の私の食料雑貨の買い物の類推参照)。