java 使用Sping Boot 删除MongoDB中的记录后,如何更新优先级列表?

oxf4rvwz  于 2023-01-24  发布在  Java
关注(0)|答案(1)|浏览(101)

我有一个连接到MongoDB的Sping Boot 应用程序,在MongoDB中有一个名为configurations的集合,包含以下文档:

_id: ObjectId('6231984016d57c64884c8e52')
name: Gio
priority: 1

_id: ObjectId('61f2a0351a7b18283fc5ce9b')
name: Blamee
priority: 2

_id: ObjectId('61f39f8ae2daa732deff6d90')
name: Lonic
priority: 3

_id: ObjectId('61e56339b528bf009feca149')
name: TechRaz
priority: 4

_id: ObjectId('62013a86b6b62621b529bed4')
name: Gild
priority: 5

所有文档都有一个唯一的优先级。从用户界面中,您可以从一个列表中更改优先级,您可以将配置拖放到您希望的优先级。但是,我遇到的问题是,当删除配置时(一次只能删除一个配置),在优先级索引中创建了一个洞。2我想知道如何编写一些代码,在删除配置时关闭优先级差距,因此,如果删除“Lonic”,我希望优先级更改如下:

_id: ObjectId('6231984016d57c64884c8e52')
name: Gio
priority: 1

_id: ObjectId('61f2a0351a7b18283fc5ce9b')
name: Blamee
priority: 2

_id: ObjectId('61e56339b528bf009feca149')
name: TechRaz
priority: 3

_id: ObjectId('62013a86b6b62621b529bed4')
name: Gild
priority: 4

这是我尝试过的方法:
删除配置后,我说:

Query query = new Query();
query.with(Sort.by(Sort.Direction.asc, "priority"));
List<Configuration> remainingConfigsAfterDelete =  mongoTemplate.find(query, Configuration.class);

for (int i = 1; i+1 < remainingConfigsAfterDelete.size(); i++) {
    remainingConfigsAfterDelete.get(i).setPriority(i);
}

然后用bulkOperations或其他方法更新所有优先级。第一优先级必须从1开始,而不是从0开始。我只是觉得我在这里做得太过了。应该有更简单的方法来做这件事。

bweufnob

bweufnob1#

删除某个优先级时,大于该优先级的每个优先级都应递减。

db.collection.updateMany({priority: {$gt: deletedPriority}},{$inc: {priority: -1}})

相关问题