我试图将大量普通物体插入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
答案 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/