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

如何通过Spring Data JPA与MongoTemplate获取MongoDB批量查询执行统计信息

批量MongoDB操作执行详情获取方案

一、Spring Boot 端实现

你当前使用的是Spring Data MongoDB提供的BulkOperations批量操作接口,执行后可以通过返回的BulkWriteResult对象获取全量执行信息,代码改造如下:

import org.springframework.data.mongodb.core.BulkOperations;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.data.util.Pair;
import com.mongodb.bulk.BulkWriteResult;
import com.mongodb.bulk.BulkWriteError;
import java.util.List;
import java.util.Map;

// 初始化批量操作对象,BulkMode可选UNORDERED(无序,性能更高,错误不阻断后续操作)/ORDERED(有序,错误直接终止)
BulkOperations ops = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, "你的集合名称");
List<Pair<Query, Update>> updateList = new ArrayList<>();

for (Map<String,Object> record : updateRecords) {
    Update update = new Update();
    Query query = Query.query(Criteria.where("_id").is(record.get("Id")));
    for (Map.Entry<String, Object> entry : record.entrySet()) {
        update.set(entry.getKey(), entry.getValue());
    }
    updateList.add(Pair.of(query,update));
}

ops.updateOne(updateList);
// 执行批量操作并接收返回结果
try {
    BulkWriteResult writeResult = ops.execute();
    // 可获取的核心执行信息
    System.out.println("匹配文档总数:" + writeResult.getMatchedCount());
    System.out.println("实际修改文档数:" + writeResult.getModifiedCount());
    System.out.println("插入文档数:" + writeResult.getInsertedCount());
    System.out.println("删除文档数:" + writeResult.getDeletedCount());
} catch (BulkOperationException e) {
    // 捕获批量操作异常,获取每条错误的详情
    List<BulkWriteError> errors = e.getErrors();
    for (BulkWriteError error : errors) {
        System.out.println("错误位置:" + error.getIndex() + ",错误原因:" + error.getMessage());
    }
}

如果需要查看实际发送给MongoDB的完整执行语句,可在配置文件中添加日志配置:

# 开启MongoDB操作语句 debug日志
logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG

二、Mongo Shell 端实现

在Mongo Shell中执行批量操作后,execute()方法会直接返回全量执行结果,示例代码如下:

// 初始化批量操作对象,有序操作使用initializeOrderedBulkOp()
var bulk = db.你的集合名.initializeUnorderedBulkOp();

// 模拟批量更新逻辑
const updateRecords = [
    {Id: "1", name: "测试1", age: 20},
    {Id: "2", name: "测试2", age: 21}
]
updateRecords.forEach(record => {
    bulk.find({_id: record.Id}).updateOne({$set: record});
})

// 执行并打印结果
var result = bulk.execute();
printjson(result);

返回结果核心字段说明:

  • nMatched:匹配到条件的文档总数
  • nModified:实际发生修改的文档总数
  • nInserted:插入成功的文档数
  • nRemoved:删除成功的文档数
  • writeErrors:操作错误列表,包含错误对应操作的索引、错误代码、错误描述
  • writeConcernErrors:写入策略不符合导致的错误列表

如果需要排查批量查询性能问题,可以对单条查询执行explain查看执行计划,确认索引是否生效:

db.你的集合名.find({_id: "测试ID"}).explain("executionStats")

内容的提问来源于stack exchange,提问作者Karan bir singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 15:54:01