Node.js中的Mongoose静默崩溃

时间:2016-07-21 16:13:43

标签: node.js mongodb

我试图将大量普通物体插入mongodb,但发生了一些非常奇怪的事情。让我们说我尝试插入像这样的1000个对象

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'});
   }
}

但是,如果我改为1000让我们说1500,那么服务器就会挂起。它从不抛出异常,既不是警告,也不是。它只是卡在那里。我一直在阅读,而且这些文件数量甚至还不及mongo支持的限额。

有人面临同样的问题吗?我在windows中使用mongo 3.2

2 个答案:

答案 0 :(得分:1)

如评论中所述,批量最大尺寸为1000 ...因此我实施了自定义BulkManager,以便在我的API中管理大量文档。

所以我的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
}

答案 1 :(得分:0)

我在插入100000条记录方面遇到了同样的问题。最后我从mongoose切换到mongodb驱动程序并使用: db.collection('mycollectionaname')。insert(arrayofrecords,{             有序的:假的         });

你也可以看看: https://docs.mongodb.com/getting-started/node/insert/