运行 Spring JPA 中针对 mongodb 的自定义删除查询时如何使用 Pageable?
How to utilize Pageable when running a custom delete query in Spring JPA for mongodb?
我正在创建一个允许管理员从数据库中清除数据的工具。我们的一个集合有数百万条记录,删除会占用系统。最初,我只是 运行 查询 returns 一个页面并将其放入标准删除。理想情况下,我更愿意 运行 一次性查询和删除。
@Query(value = "{ 'timestamp' : {$gte : ?0, $lte: ?1 }}")
public Page deleteByTimestampBetween(Date from, Date to, Pageable pageable);
这可能吗,使用上面的代码,系统的行为与程序不继续删除功能和数据不从 mongo 中删除的情况相同。或者有更好的方法吗?
我认为使用 Pageable/Query 注释是不可能的。您可以使用Bulk Write来批量处理删除。
类似
int count = 0;
int batch = 100; //Send 100 requests at a time
BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, YourPojo.class);
List<DateRange> dateRanges = generateDateRanges(from, to, step); //Add a function to generate date ranges with the defined step.
for (DateRange dateRange: dateRanges){
Query query = new Query();
Criteria criteria = new Criteria().andOperator(Criteria.where("timestamp").gte(dateRange.from), Criteria.where("timestamp").lte(dateRange.to));
query.addCriteria(criteria);
bulkOps.remove(query);
count++;
if (count == batch) {
bulkOps.execute();
count = 0;
}
}
if (count > 0) {
bulkOps.execute();
}
我正在创建一个允许管理员从数据库中清除数据的工具。我们的一个集合有数百万条记录,删除会占用系统。最初,我只是 运行 查询 returns 一个页面并将其放入标准删除。理想情况下,我更愿意 运行 一次性查询和删除。
@Query(value = "{ 'timestamp' : {$gte : ?0, $lte: ?1 }}")
public Page deleteByTimestampBetween(Date from, Date to, Pageable pageable);
这可能吗,使用上面的代码,系统的行为与程序不继续删除功能和数据不从 mongo 中删除的情况相同。或者有更好的方法吗?
我认为使用 Pageable/Query 注释是不可能的。您可以使用Bulk Write来批量处理删除。
类似
int count = 0;
int batch = 100; //Send 100 requests at a time
BulkOperations bulkOps = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, YourPojo.class);
List<DateRange> dateRanges = generateDateRanges(from, to, step); //Add a function to generate date ranges with the defined step.
for (DateRange dateRange: dateRanges){
Query query = new Query();
Criteria criteria = new Criteria().andOperator(Criteria.where("timestamp").gte(dateRange.from), Criteria.where("timestamp").lte(dateRange.to));
query.addCriteria(criteria);
bulkOps.remove(query);
count++;
if (count == batch) {
bulkOps.execute();
count = 0;
}
}
if (count > 0) {
bulkOps.execute();
}