Mongoose:Model.create和Collection.insert有什么区别?

22

我想在MongoDB中执行批量插入操作,并在Mongoose中找到了两种方式:

其中一种方法是使用insert

dataArr = [
   {
       id: "",
       name: ""
   }
   {
       id: "",
       name: ""
   }
]

Collection.insert(dataArr)

另一种方式是Model.create

Model.create(dataArr)

两者都可以完成批量插入作业,但它们之间有什么区别?

哪一个更高效?


我一直是深入代码并跟踪代码的忠实支持者。这是开源的最大好处之一。 - WiredPrairie
还可以参考之前有关两种方法性能差异的问题的这个答案 - Lucio Paiva
4个回答

39
在Mongoose中,有Model.createCollection.insert(后者不严格属于Mongoose,而是底层的MongoDB驱动程序)。
根据Mongoose开发人员的说法,当使用文档数组调用它们时,它们基本上是相同的,尽管查看代码让我认为存在细微差别(警告:我没有仔细查看代码,所以以下内容可能有误):
  • 使用Model.create将调用架构上声明的任何验证器/钩子;
  • Model.create对数组中的每个文档执行.save,导致N个数据库调用(其中N是数组中文档的数量);Collection.insert执行一个大型的数据库调用;

2
从Mongoose v3.8.12开始,“Model.collection.insert”比“Model.create”运行速度要快得多。如果要进行批量插入,您应该考虑使用它。请参阅https://dev59.com/n2Qn5IYBdhLWcg3wkH7U#24848148。 - Lucio Paiva
你能给一个真实的例子来说明这个方法吗?在我的代码中使用Model.collection没有任何作用。在mongoos模式中定义你的集合,例如{collection: 'myName'}可以工作,但是访问它却不行。 - Stephan Kristyn
5
还有一个需要注意的重要区别。当验证时,Model.create会将字符串 ObjectId 转换为实际的 ObjectId,如果模式将其指定为字段类型,而 Model.collection.insert 则不会,因此它将字符串插入为普通字符串。 - Adam Reis
@AdamBuczynski 很好的观点。基本上,通过使用底层的 MongoDB 驱动程序,很多 Mongoose 提供的功能将被规避(这就解释了为什么它更快,但这是需要注意的事情)。 - robertklep

1
根据我所了解到的,Collection.insert是mongoDB驱动程序的一个函数,它在插入大量数据(如数百万)时速度更快,但代价是绕过mongoose验证。
小心处理。

1
请将此答案添加到帖子下面,而不是作为答案。 - Maelig
我无法将其添加为评论,所以我在这里回答了。 - chuni
你在原帖的所有评论下面都没有“添加评论”的选项吗? - Maelig
3
是的,但是对我来说不可用,我的意思是我看到了“添加评论”的选项,但在我获得声望之前我无法添加评论。 - chuni

0

它们大致意思相同,你可以使用其中任何一个。


0

查看insertMany的文档,显然它比create更快,因为它只向服务器发送一个操作,而不是每个文档都发送一个操作。

insertMany documentation需要注意的一件事是,insertMany不会触发保存中间件,而另一方面,create会触发。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接