现在Mongoose v3.6+ 是否支持批量插入?我搜索了几分钟,但符合这个问题的内容都是几年前的了,而且答案都是明确的否定。
编辑:
答案是使用 Model.create()
。create()`接受一个数组作为它的第一个参数,所以你可以把要插入的文档作为一个数组传入。
请参阅 Model.create() 文档。
如果要处理大量数据,`Model.create()是一种糟糕的插入方式。它会**非常慢。在这种情况下,你应该使用
Model.collection.insert,它的性能**要好得多**。根据批量文件的大小,
Model.create()甚至会崩溃!我用一百万个文档试过,没有成功。使用
Model.collection.insert`` 只需几秒钟。
Model.collection.insert(docs, options, callback)
docs
是要插入的文档数组;options
是一个可选的配置对象--参见the docscallback(err, docs)
将在保存所有文档或发生错误后调用。成功时,docs 是持久化文档的数组。正如 Mongoose'author 所指出的 此处,该方法将绕过任何验证程序,直接访问 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更新:虽然 "insert() "仍可正常使用,但它已被弃用,转而使用insertMany()
。参数完全相同,所以你可以直接用它来替代,一切都会正常工作(嗯,返回值有点不同,但你可能无论如何都不会使用它)。
事实上,你可以使用 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.collection.insert()
而不是上面示例中使用的 Candy.create()` - 因为它更快(
create()会在每个项目上调用 ``Model.save()
所以更慢)。
更多信息,请参阅 Mongo 文档: http://docs.mongodb.org/manual/reference/method/db.collection.insert/
(感谢 arcseldon 指出这一点)