Mongoose v3.6现在支持批量插入吗?我搜索了几分钟,但任何与此查询匹配的内容都有几年的历史了,答案是明确的否。
编辑:
为了将来参考,答案是使用Model. create()
。create()
接受一个数组作为其第一个参数,因此您可以将文档作为数组插入。
请参见Model. create()留档
Model. create()
如果你处理的是一个非常大的批量,那么插入是一个糟糕的方法。它会非常慢。在这种情况下,你应该使用Model.集合.插入
,它的性能要好得多。根据批量的大小,Model.create()
甚至会崩溃!用一百万个文档尝试过,运气不好。使用Model.集合.插入
只需几秒钟。
Model.collection.insert(docs, options, callback)
文档
是要插入的文档数组;选项
是一个可选的配置对象-请参阅文档回调(err,文档)
将在所有文档保存或发生错误后调用。成功时,文档是持久化文档的数组。正如Mongoose的作者在这里指出的那样,这种方法将绕过任何验证程序,直接访问Mongo驱动程序。这是一个你必须做出的权衡,因为你正在处理大量数据,否则你根本无法将其插入到你的数据库中(记住我们在这里谈论的是成千上万的文档)。
var Potato = mongoose.model('Potato', PotatoSchema);
var potatoBag = [/* a humongous amount of potato objects */];
Potato.collection.insert(potatoBag, onInsert);
function onInsert(err, docs) {
if (err) {
// TODO: handle error
} else {
console.info('%d potatoes were successfully stored.', docs.length);
}
}
更新2019-06-22:虽然插入()
仍然可以很好地使用,但它已被弃用,取而代之的是插入许多()
。参数完全相同,因此您可以将其用作直接替换,一切都应该正常工作(好吧,返回值有点不同,但您可能无论如何都不会使用它)。
Mongoose 4.4.0使用模型方法引入了--true--批量插入。插入许多()
。它比循环. create()
或为其提供数组要快得多。
用法:
var rawDocuments = [/* ... */];
Book.insertMany(rawDocuments)
.then(function(mongooseDocuments) {
/* ... */
})
.catch(function(err) {
/* Error handling */
});
或者
Book.insertMany(rawDocuments, function (err, mongooseDocuments) { /* Your callback function... */ });
您可以跟踪它:
事实上,你可以使用Mongoose的“create”方法,它可以包含一个文档数组,看这个例子:
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.集合.插入()
而不是Candy. create()
-在上面的示例中使用-因为它更快(create()
在每个项目上调用Model.save()
所以它更慢)。
有关详细信息,请参阅Mongo留档:http://docs.mongodb.org/manual/reference/method/db.collection.insert/
(感谢Arcseldon指出这一点)