如何通过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
相关产品推荐
相关产品推荐

