使用Spring Data MongoDB聚合批量删除文档

vbkedwbf  于 2023-01-16  发布在  Go
关注(0)|答案(1)|浏览(136)

考虑一个聚合,其形式如下:

MatchOperation matchOperation = match(Criteria.where("group").is("A")
                               .andOperator(Criteria.where("score").lt(50))) ;
SortOperation sortOperation = sort(Sort.by(Direction.DESC, "department")); 

Aggregation aggregation = Aggregation.newAggregation(matchOperation, sortOperation) ;

我想使用Sping Boot 应用程序发布一个批量删除(或基本上删除作为上述结果发现的每个文档)。

**问题:**找不到合适的方法来执行此操作,我只想使用聚合来实现此操作,即不想切换到查询。
我已经尝试过

1.我已经尝试过使用mongoTemplate.findAllAndRemove(),但它接受查询,我使用的是聚合。
1.我也尝试过使用BulkOperations bulkOps = mongoTemplate.bulkOps(BulkMode.ORDERED, EntityName.class) ;bulkOps.remove(),但此方法也接受List<Query>

tv6aics1

tv6aics11#

你不能使用aggregation删除,所以我认为有两个选择:

  • 使用聚合查询获取所有_id,并执行新查询以删除这些_id

类似于以下内容(未测试):

List<Document> result = mongoTemplate.aggregate(aggregation, "my_collection", Document.class).getMappedResults();
List<ObjectId> resultList = result.stream().map(item -> item.get("_id")).collect(Collectors.toList());

mongoTemplate.remove(new Query(Criteria.where("_id").in(resultList)), YourClass.class);
  • 创建一个新的delete查询。由于您需要使用delete,因此您可以简单地使用以下命令来避免聚合:
mongoTemplate.remove(new Query(Criteria.where("group").is("A").andOperator(Criteria.where("score").lt(50))), YourClass.class);

请注意,条件与match中的条件相同。这是因为在find/remove/update queryaggregation query中使用条件是相同的
顺便说一下,我不明白为什么排序,如果你想删除。

相关问题