129

現在、Mongoose v3.6 +はバッチ挿入をサポートしていますか? 数分間検索しましたが、このクエリに一致するものはすべて数年前のものであり、答えは明確なノーでした.

編集:

今後の参考のために、答えは を使用することModel.create()です。create()最初の引数として配列を受け入れるため、挿入するドキュメントを配列として渡すことができます。

Model.create() のドキュメントを参照してください

4

8 に答える 8

123

Mongoose 4.4.0 が一括挿入をサポートするようになりました

Mongoose 4.4.0 では、model メソッドを使用した --true--bulk insert が導入されました.insertMany()。ループし.create()たり、配列を提供したりするよりもはるかに高速です。

使用法:

var rawDocuments = [/* ... */];

Book.insertMany(rawDocuments)
    .then(function(mongooseDocuments) {
         /* ... */
    })
    .catch(function(err) {
        /* Error handling */
    });

または

Book.insertMany(rawDocuments, function (err, mongooseDocuments) { /* Your callback function... */ });

あなたはそれを追跡することができます:

于 2016-02-03T10:38:03.960 に答える
22

実際、Mongoose の「作成」メソッドを使用できます。これには、ドキュメントの配列を含めることができます。次の例を参照してください。

Candy.create({ candy: 'jelly bean' }, { candy: 'snickers' }, function (err, jellybean, snickers) {
});

コールバック関数には、挿入されたドキュメントが含まれています。挿入する必要がある項目の数 (上記のように引数の長さが固定されている) が常にわかっているとは限らないため、それらをループすることができます。

var insertedDocs = [];
for (var i=1; i<arguments.length; ++i) {
    insertedDocs.push(arguments[i]);
}

更新: より良い解決策

より良い解決策は、Candy.collection.insert()代わりに使用することですCandy.create()-上記の例で使用されています-より高速であるためです(各アイテムcreate()で呼び出しModel.save()ているため、低速です)。

詳細については、Mongo のドキュメントを参照してください: http://docs.mongodb.org/manual/reference/method/db.collection.insert/

(これを指摘してくれたarcseldonに感謝)

于 2014-03-29T20:30:15.127 に答える
4

最高スコアの回答として、マングースを使用して一括挿入を実行できます。ただし、この例は機能しません。次のようにする必要があります。

/* a humongous amount of potatos */
var potatoBag = [{name:'potato1'}, {name:'potato2'}];

var Potato = mongoose.model('Potato', PotatoSchema);
Potato.collection.insert(potatoBag, onInsert);

function onInsert(err, docs) {
    if (err) {
        // TODO: handle error
    } else {
        console.info('%d potatoes were successfully stored.', docs.length);
    }
}

一括挿入にスキーマ インスタンスを使用しないでください。プレーンなマップ オブジェクトを使用する必要があります。

于 2015-03-16T03:35:28.700 に答える
4

配列に値を挿入することで、mongoDB シェルを使用して一括挿入を実行できます。

db.collection.insert([{values},{values},{values},{values}]);
于 2014-08-08T09:03:30.020 に答える
4

マングースを使うと1000ドキュメント以上の制限があるようですが、

Potato.collection.insert(potatoBag, onInsert);

以下を使用できます。

var bulk = Model.collection.initializeOrderedBulkOp();

async.each(users, function (user, callback) {
    bulk.insert(hash);
}, function (err) {
    var bulkStart = Date.now();
    bulk.execute(function(err, res){
        if (err) console.log (" gameResult.js > err " , err);
        console.log (" gameResult.js > BULK TIME  " , Date.now() - bulkStart );
        console.log (" gameResult.js > BULK INSERT " , res.nInserted)
      });
});

しかし、10000 個のドキュメントでテストすると、これはほぼ 2 倍の速度になります。

function fastInsert(arrOfResults) {
var startTime = Date.now();
    var count = 0;
    var c = Math.round( arrOfResults.length / 990);

    var fakeArr = [];
    fakeArr.length = c;
    var docsSaved = 0

    async.each(fakeArr, function (item, callback) {

            var sliced = arrOfResults.slice(count, count+999);
            sliced.length)
            count = count +999;
            if(sliced.length != 0 ){
                    GameResultModel.collection.insert(sliced, function (err, docs) {
                            docsSaved += docs.ops.length
                            callback();
                    });
            }else {
                    callback()
            }
    }, function (err) {
            console.log (" gameResult.js > BULK INSERT AMOUNT: ", arrOfResults.length, "docsSaved  " , docsSaved, " DIFF TIME:",Date.now() - startTime);
    });
}
于 2015-08-02T18:37:55.290 に答える