Spring Boot MongoTemplate执行remove时limit限制不生效如何解决
问题根因
MongoDB原生的deleteMany/普通删除指令本身不支持通过limit参数限制单次删除的文档数量,Spring Data MongoDB的mongoTemplate.remove()方法在构造底层删除请求时,会自动丢弃Query对象上配置的limit、skip这类仅对读操作生效的参数,因此你设置的limit(3)不会对删除行为产生约束,最终会删除所有匹配条件的文档。
而mongoTemplate.find()是纯读操作,会完整解析Query上的所有查询、分页、排序配置,所以limit可以正常生效。
单查询实现限条数删除的方案
不需要先查询出待删文档ID再发起二次删除请求,直接调用mongoTemplate.findAllAndRemove()即可实现单次请求完成限条数删除:该方法会完全遵循Query对象上配置的匹配条件、排序规则、limit条数限制,匹配到对应数量的文档后原子删除,全程只和MongoDB交互一次。
示例代码:
Query query = new Query(); query.addCriteria(Criteria.where("_id").lt(id)) .limit(3) // 建议补充排序规则,避免因MongoDB默认返回顺序不确定删错数据,比如固定按_id升序删最小的3条 .with(Sort.by(Sort.Direction.ASC, "_id")); // 执行删除,返回值为本次被删除的文档列表 List<TestCollection> deletedRecords = mongoTemplate.findAllAndRemove(query, TestCollection.class);
如果使用的Spring Data MongoDB版本过低不支持findAllAndRemove,也可以直接调用底层findAndModify指令配置remove: true参数,搭配limit实现同等效果。
内容的提问来源于stack exchange,提问作者Jaspreet Jolly
相关产品推荐
相关产品推荐

