【问题标题】:Mongoose silent crash in Node.jsNode.js 中的 Mongoose 静默崩溃
【发布时间】:2016-11-25 08:16:52
【问题描述】:

我正在尝试向 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

【问题讨论】:

标签: node.js mongodb


【解决方案1】:

如 cmets 中所述,批量最大大小为 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
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-02-22
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      • 2020-01-20
      • 2020-07-12
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多