提问者:小点点

Mongoose(mongoDB)批量插入?


Mongoose v3.6现在支持批量插入吗?我搜索了几分钟,但任何与此查询匹配的内容都有几年的历史了,答案是明确的否。

编辑:

为了将来参考,答案是使用Model. create()create()接受一个数组作为其第一个参数,因此您可以将文档作为数组插入。

请参见Model. create()留档


共3个答案

匿名用户

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:虽然插入()仍然可以很好地使用,但它已被弃用,取而代之的是插入许多()。参数完全相同,因此您可以将其用作直接替换,一切都应该正常工作(好吧,返回值有点不同,但您可能无论如何都不会使用它)。

  • Mongo留档
  • Aaron Heckman在Google群组上讨论批量插入

匿名用户

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... */ });

您可以跟踪它:

  • https://github.com/Automattic/mongoose/issues/723
  • https://github.com/Automattic/mongoose/blob/1887e72694829b62f4e3547283783cebbe66b46b/lib/model.js#L1774

匿名用户

事实上,你可以使用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指出这一点)