You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MongoDB bulkWrite获取总upsertedCount与matchedCount问题

解决MongoDB bulkWrite批量updateMany的统计结果问题

问题根源

你当前的代码仅向bulkWrite传入了单个updateMany操作,所以返回的BulkWriteResult只对应这一条操作的统计数据。要实现批量处理1000条文档,必须构建包含1000个独立更新操作的数组。

修正后的代码示例

假设你有一个包含1000个产品对象的数组products,可以按以下方式生成批量操作列表:

// 假设products是包含1000个产品数据的数组
const bulkOperations = products.map(product => ({
  updateOne: { // 用updateOne更精准,因为你的过滤条件通常匹配单个文档
    filter: { name: product.name },
    update: {
      $setOnInsert: {
        name: product.name,
        description: product.description,
        price: product.price,
        category: product.category
      }
    },
    upsert: true
  }
}));

// 替换成你的集合名称
db.collection('your-collection-name').bulkWrite(bulkOperations, { ordered: false })
  .then(results => {
    console.log('总匹配文档数:', results.matchedCount);
    console.log('总插入文档数:', results.upsertedCount);
    console.log('所有插入的文档ID:', results.upsertedIds);
  })
  .catch(err => console.error('批量操作失败:', err));

核心说明

  • 替换updateMany为updateOne:你的过滤条件是{name: product.name},通常对应唯一文档,用updateOne更贴合业务逻辑,也避免误匹配多条文档导致统计异常。
  • 批量操作数组:通过map遍历产品数组,为每个产品生成独立的updateOne操作。传入bulkWrite后,返回的results会包含所有操作的累计统计值:
    • matchedCount:所有操作中匹配到的已有文档总数
    • upsertedCount:所有操作中触发插入的新文档总数
    • upsertedIds:键为操作在数组中的索引,值为对应插入文档的ObjectId

预期返回结果示例

修正后返回的累计统计结果会类似如下结构:

BulkWriteResult {
  insertedCount: 0,
  matchedCount: 720, // 720条已有文档匹配成功
  modifiedCount: 0,
  deletedCount: 0,
  upsertedCount: 280, // 280条新文档被插入
  upsertedIds: {
    '0': new ObjectId('6684fe4d1625ae49f6233577'),
    '3': new ObjectId('6684fe4d1625ae49f6233578'),
    // ... 剩余278个插入的文档ID
  },
  insertedIds: {}
}

内容的提问来源于stack exchange,提问作者ksdev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 16:10:02