我正在为NodeJs使用mongodb驱动程序,其中有3种方法:
1) 数据库集合插入
2) db.collection.insertOne
3) db.collection.insertMany
我发现db.collection.insert同时完成insertOne和insertMany的工作。
我也发现了相同的方法删除&更新。
相对于db.collection.insertOne&db.collection.insert有很多方法?
可以肯定的是,我正在一个收藏中工作,在某个时候会有一百万条记录。
有一些细微的差异:
- db.collection.explain()不适用于insertOne()或insertMany(),但适用于insert()
- insertMany()和insert()可以是有序的(默认)也可以是无序的。在后一种情况下,由于性能原因,mongo可能会执行重新排序
- insert()返回WriteResult文档,而不是状态文档(包含新的objectId)
所以这取决于您选择的访问模式。通常,为了提高性能,如果必须添加多个文档,请尝试只调用1个(insert()或insertMany()),并使其无序(如果从应用程序的角度来看可能的话)。如果问题是你应该使用(insert()还是insertMany(),这取决于你是否需要explain()或产生的objectId,但在性能方面没有区别(如果你键入:db.yourCollection.insert
或db.yourCollection.insertMany
(没有()
),你会发现两者都执行bulk.insert(obj)
)
TL;DR:
- 插入1个文档:insertOne()或insert()
- 插入n个文档:insertMany()或insert()
- 插入文档无序:insertMany()或insert()+有序:false
- 您需要ObjectId的操作状态:insertOne()或insertMany()
- 您需要WriteResult:insert()
- 您需要explain():insert()
在我的测试中,insert_one()
和insert_many()
的性能相差10倍。
我使用的是Python 3.9和MongoDB 5.0,我将~5M行/~500MB的CSV文件的每一行作为一个文档插入MongoDB集合中。它产生了一个4.8GB的集合,根据MongoDB Compass的报告,每个文档大约有1KB。
花了:
- 3048s带
insert_one()
- 301个
insert_many()
,批次为1000行 - 291个
insert_many()
,批次为5000行 - 273s,
insert_many()
,批量10000行
性能测试
- 3.7k x 50000数据
- 尝试考虑相同的条件
- Meteor驱动程序封装光纤的节点驱动程序以编写代码
节点驱动程序测试
- 节点驱动程序insertMany with async+Promise sync:10~11秒
- 节点驱动程序insertMany with async:13 ~ 15秒
- 异步节点驱动程序插入:20~23秒
流星驱动器测试
- 带异步的Meteor驱动程序插入:24~27秒
- 带同步的Meteor驱动程序插入:43-49秒
结论
- insertMany比insert快得多
- Promise+await比async快
- 无法解释。有什么想法吗
- 批量插入的Meteor同步功能较慢
在对30个文档执行操作时,使用insert/update和many选项更有效,如:
- 有一个对服务器的调用
- 服务器引擎进程在不等待新数据的情况下工作
因此,减少往返、网络开销并允许数据库引擎一次处理所有文档,与通过客户端上的所有文档逐个调用插入/更新进行循环相比,具有列出的优势