なっく日報

技術やら生活やらのメモ

MongoDB 2.6系以降ではmongo shellの大量データ処理にはBulk()を使う

今日久しぶりにもんごもんごして、知ったことをメモ。

概要

docs.mongodb.org

に書かれている内容そのままです。

MongoDB2.6以降では、mongo shellで↓のように書いていたコードを

for (var i = 1; i <= 1000000; i++) {
    db.test.insert( { x : i } );
}

↓のように変更する必要があるそう。

var bulk = db.test.initializeUnorderedBulkOp();

for (var i = 1; i <= 1000000; i++) {
    bulk.insert( { x : i} );
}

bulk.execute( { w: 1 } );

MongoDB2.6以降でのmongo shellの挙動の変更点

2.6未満では、明示的にgetLastError()を呼ばないと、投げっぱなし(fire-and-forget)でした。
ところが、2.6以降では、デフォルトのWrite Concernが、acknowledgedになったそう。
この挙動の変更により、クラスタ環境でのwriteのスループットが落ちてしまうとのことです。

解決策

docs.mongodb.org

を使えと。

initializeOrderedBulkOp()initializeUnorderedBulkOp()というメソッドがあるようです。

initializeXXXBulkOp()メソッドを使って、bulkオブジェクトを取得して、ゴニョゴニョっとすると。

まとめ

実際に動かした訳ではありません?
が、そのうち使うので、ちゃんと覚えておこう。