MongoDB如何借助$in实现批量upsert,替代循环单条更新操作
为什么你的批量$in写法无法生效
你使用$in + upsert + multi的写法不生效是MongoDB的固有逻辑限制:当upsert为true时,仅当查询条件匹配到至少一条已有文档时,multi才会生效批量更新所有匹配项;如果没有匹配到任何文档,MongoDB只会插入1条新文档,不会为$in列表中的每个product_id都生成对应的新文档,完全达不到你要的每个产品独立upsert的需求。
可行解决方案:使用
bulkWrite批量操作 bulkWrite是MongoDB专门提供的批量写操作接口,仅需1次或少量几次数据库交互就能提交所有操作,大幅降低网络往返开销,性能远高于循环单条执行update,完全适配你的场景,示例代码如下:
// 构造批量操作数组 const operations = a_group.map(p => ({ updateOne: { filter: { product_id: p._id, year: 2021 }, update: { $set: { 'abc.34': 'a' } }, upsert: true } })) // 执行批量操作 db.abc.bulkWrite(operations)
注意事项
- MongoDB单次
bulkWrite请求的最大BSON体积为16MB,如果你的a_group体量极大(比如超过1万条),可以分批提交,比如每5000条操作执行一次bulkWrite,避免超出大小限制。 bulkWrite默认是有序执行的,如果你的多个操作之间没有依赖关系,可以添加{ ordered: false }参数进一步提升性能,MongoDB会并行处理所有操作,单条操作失败也不会影响其他操作的执行:
db.abc.bulkWrite(operations, { ordered: false })
内容的提问来源于stack exchange,提问作者glennn
相关产品推荐
相关产品推荐

