2016-07-21 5 views
2

mongodbに大量の普通のオブジェクトを挿入しようとしていますが、非常に奇妙なことが起こっています。のは、私はこのNode.jsのMongooseサイレントクラッシュ

for (var i = 0; i < 1000; i++) { 
    var commentAux = { 
     'a': 'test' + i, 
     'b': 'https://test.com', 
     'c': appUser.id, 
     'd': 'test of' + i 
    } 
    comments.push(commentAux); 
} 
Comment.collection.insert(comments, function (err, docs) { 
    if (err) { 
    return res.json({success: false, message: 'Comments Fail'}); 
    } 
} 

のようなしかし、私は、サーバーのハング、1500年を言うことができます1000を変更した場合、1000個のオブジェクトを挿入しようとしましょう。それは逃げることも、警告も、何もすることもありません。それはちょうどそこにくっついた。私は読んできましたが、この量の文書はmongoがサポートしている限度額にも達していません。

誰かが同じ問題に直面していますか?私は窓でmongo 3.2を使用しています

+0

あなたも見てみることができますか?それは[これの](https://docs.mongodb.com/manual/reference/limits/#Write-Command-Operation-Limit-Size)が原因かもしれませんが、わかりません。 – robertklep

+2

http://stackoverflow.com/questions/16726330/mongoose-mongodb-batch-insert?answertab=active#tab-top一括処理の場合 – Rabea

+1

吊り下げ理由はわかりませんが、一括最大サイズは1000です。 1000以上のメリットがあります。https://docs.mongodb.com/manual/reference/limits/#Write-Command-Operation-Limit-Size – helmy

答えて

1

コメントで述べたように、バルクの最大サイズは1000です...私はAPIで大量のドキュメントを管理するためにカスタムBulkManagerを実装しました。

私のBulkManager.jsはこれです。

module.exports = function() { 
    var instance = {}; 
    var Promise = require("bluebird"); 
    var Q = require("q"); 
    Promise.promisifyAll(instance); 

    instance.insert = function (DbModel, items) { 
     var arrays = [], size = 1000; 

     while (items.length > 0) 
      arrays.push(items.splice(0, size)); 

     return saveItems(DbModel, arrays, arrays.length, 0); 
    }; 

    var deferred = Q.defer(); 

    function saveItems(DbModel, arrays, amountToProcess, indexToProcess) { 
     if (indexToProcess <= (amountToProcess - 1)) { 
      var items = arrays[indexToProcess]; 
      DbModel.collection.insert(items, function (err, docs) { 
       if (err) { 
        return deferred.reject({success: false, error: err}); 
       } 

       if (amountToProcess > 1 && indexToProcess < (amountToProcess - 1)) { 
        indexToProcess++; 
        saveItems(DbModel, arrays, amountToProcess, indexToProcess); 
       } else { 
        return deferred.resolve({success: true, docs: docs}); 
       } 
      }); 
     } 
     return deferred.promise; 
    } 
    return instance; 
}; 

私のAPIからは、このように呼びます。

BulkManager.insert(PhotoModel, photos).then(function (response) { 
    if (!response.success) { 
     return res.json({success: false, message: 'Photos Fail'}); 
    } 
    // do stuff on success 
} 
0

私は100000レコードを挿入するのと同じ問題がありました。最後にmongooseからmongodbドライバに切り替えて使用しました。 db.collection( 'mycollectionaname')。insert(arrayofrecords、{ ordered:false });何をログにMongoDBん https://docs.mongodb.com/getting-started/node/insert/

関連する問題