Mongodb/Mongoose bulkwrite(upsert) 性能问题
Posted
技术标签:
【中文标题】Mongodb/Mongoose bulkwrite(upsert) 性能问题【英文标题】:Mongodb/Mongoose bulkwrite(upsert) performance issues 【发布时间】:2021-07-06 18:33:27 【问题描述】:我在我们的 Nodejs api 中使用 mongoDB 和 mongoose,我们需要为数据源是 JSON 的集合做某种种子,我正在使用 Model.bulkwrite
,它在内部使用 mongodb 的 Bulkwrite(https://docs.mongodb.com/manual/core/bulk-write-operations)。
代码如下,
await Model.bulkWrite(docs.map(doc => (
updateOne: ..... // update document
insertOne: ....... // insert document
updateOne: ..... // update document
insertOne: ....... // insert document
.
.
.n
)))
这适用于我们当前只有几百个文档的用例, 但是我们担心它会如何扩展,当文档数量增加很多时它的性能,比如当文档数量达到 10000 时会有什么问题。 只是想确认我们是否走在正确的道路上,或者是否有任何改进的余地。
【问题讨论】:
【参考方案1】:Mongodb 中的 Bulkwrite 目前在单个批次中的最大限制为 100,000 次写入操作。来自文档
每组的操作数不能超过数据库的maxWriteBatchSize的值。从 MongoDB 3.6 开始,此值为 100,000。该值显示在 isMaster.maxWriteBatchSize 字段中。
此限制可防止出现过大错误消息的问题。如果一组 超过此限制,客户端驱动程序将组划分为更小的 计数小于或等于限制值的组。为了 例如,maxWriteBatchSize 值为 100,000,如果队列 由 200,000 个操作组成,驱动程序创建 2 个组,每个组具有 100,000 次操作。
因此,在超出此限制之前,您不会遇到任何性能问题。
供您参考:
Mongodb Bulkwrite: db.collection.bulkWrite()
Write Command Batch Limit Size
【讨论】:
首先,非常感谢,是的,我知道这些限制,并且我已经阅读了文档,但是 mongoDB 文档中还有一部分关于批量操作 (docs.mongodb.com/manual/reference/method/Bulk/…) 说操作的限制是 1000,我在某处读到,由于这个检查这个视频,人们几乎没有遇到同样的问题 (youtube.com/watch?v=mX_BJ8d2ntM),现在我尝试在我们的环境中测试我的解决方案,用于近 2k 个文档它运行良好(需要 20-30 秒)并且没有遇到任何问题。 是的,Mongodbbulk
的限制较小。在问题中有bulkwrite
被使用,所以我只回答了bulkwrite。以上是关于Mongodb/Mongoose bulkwrite(upsert) 性能问题的主要内容,如果未能解决你的问题,请参考以下文章
如何使用用户名和密码连接 mongodb(mongoose)?
MongoDB / Mongoose 单元测试 - 最佳实践? [关闭]