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 秒)并且没有遇到任何问题。 是的,Mongodb bulk 的限制较小。在问题中有bulkwrite被使用,所以我只回答了bulkwrite。

以上是关于Mongodb/Mongoose bulkwrite(upsert) 性能问题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用用户名和密码连接 mongodb(mongoose)?

MongoDB、Mongoose 和复合 _id

mongodb -mongoose 增删查改

MongoDB / Mongoose 单元测试 - 最佳实践? [关闭]

?? Mongoose?Node.js?MongodB ?????????????

mongodb / mongoose 中的部分索引