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.create
和 Collection.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.create + Q 将 mongoose 承诺转换为 Q 承诺