Mongoose:Model.create 和 Collection.insert 有啥区别

Posted

技术标签:

【中文标题】Mongoose:Model.create 和 Collection.insert 有啥区别【英文标题】:Mongoose: what's the differences between Model.create and Collection.insertMongoose:Model.create 和 Collection.insert 有什么区别 【发布时间】:2013-11-11 03:24:53 【问题描述】:

我想在 MongoDB 中进行批量插入作业,我在 mongoose 中找到了两种方法:

一种方法是使用insert:

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

Collection.insert(dataArr)

另一种方式是Model.create:

Model.create(dataArr)

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

哪个效率更高?

【问题讨论】:

我一直非常支持深入研究和跟踪代码。这是开源的最大好处之一。 另见 this answer 上一个关于两种方法的性能差异的问题。 【参考方案1】:

在 Mongoose 中,有 Model.createCollection.insert(后者严格来说不是 Mongoose 的一部分,而是底层 MongoDB 驱动程序的一部分)。

根据 Mongoose 开发人员的说法,当使用一组文档调用它们时,它们是 basically the same,尽管查看代码让我觉得存在细微差别(警告:我没有看过在代码 that 很好,所以我可能会误解以下内容):

使用Model.create 将调用在您的架构上声明的任何验证器/挂钩; Model.create 为数组中的每个文档执行.save,导致N 数据库调用(其中N 是数组中的文档数); Collection.insert 执行一次大型数据库调用;

【讨论】:

从 Mongoose v3.8.12 开始,Model.collection.insert 的运行速度比Model.create很多。如果进行批量插入,您应该考虑到它。见***.com/a/24848148/778272。 你能用这个方法举一个真实的例子吗?在我的代码中使用 Model.collection 什么都不做。使用 collection: 'myName' 在 mongoos 架构中定义您的集合是可行的,但不能访问它。 还有另一个值得注意的重要区别。 Model.create 在验证时也会将字符串 ObjectId 转换为实际的 ObjectId,如果架构将其指定为字段的类型,而 Model.collection.insert 不会,因此它将字符串作为纯字符串插入。 @AdamBuczynski 好点。基本上,通过使用底层 MongoDB 驱动程序,Mongoose 提供的很多东西都会被规避(这就解释了为什么它要快得多,但它需要注意)。【参考方案2】:

根据我所读到的,Collection.insert 是 mongoDB 驱动程序的一个功能,它在插入大量数据(如数百万左右)时要快得多,但代价是它绕过了 mongoose 验证。

小心处理

【讨论】:

请在帖子下添加这个答案,而不是作为答案 我无法将其添加为评论,这就是我在这里回答的原因 原帖所有cmets下都没有add a comment选项? 是的,但它对我不可用,我的意思是我看到添加评论,但在我获得声誉之前我无法添加【参考方案3】:

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

【讨论】:

以上是关于Mongoose:Model.create 和 Collection.insert 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

传递文档数组时,Mongoose 中 Model.create 的原子性

mongoose Model.create 函数返回未定义

Mongoose.create + Q 将 mongoose 承诺转换为 Q 承诺

mongoose项目随笔

MongooseJS - 具有现有引用的Model.create

Mongoose:3 路文件加入