java 如何在Sping Boot 中为新对象分配正确的优先级?

xvw2m8pv  于 2023-03-06  发布在  Java
关注(0)|答案(1)|浏览(101)

在我的Sping Boot 应用程序中有以下类:

@Document(collection = "setting")
public class Setting {
    private @MongoId(FieldType.OBJECT_ID)
    ObjectId id;
    private String name;
    private String type;
    private Integer priority;
}

我有一个REST POST端点,在那里我得到一个带有名称和类型但没有优先级的Setting对象,然后我必须把它放入我的MongoDB中,但我必须把它放入MongoDB中并具有正确的优先级。
1是最高优先级,每种类型的优先级都是唯一的,所以不能在同一类型中有两个相同优先级的设置。新设置的优先级最低,这意味着如果我有3个1-3优先级的设置,那么新设置的优先级将为4,如果没有设置,那么新设置的优先级将为1。
我现在是这么解决的:

Aggregation priorityAggregation = Aggregation.newAggregation(
    Aggregation.match(where("type").is(setting.getType)))
    Aggregation.group().max("priority").as("priority"),
    Aggregation.project("priority").andExclude("_id")
);

Map<String, Integer> maxPriority = mongo.aggregate(priorityAggregation, "setting", HashMap.class).getUniqueMappedResult();

if (maxPriority != null && maxPriority.containsKey("priority") && maxPriority.get("priority") != null) {
    baseConfig.setPriority(maxPriority.get("priority") + 1);
} else {
    baseConfig.setPriority(1);
}

MongoTemplate.save(setting);

这样做可以,但看起来不太好。有没有更好的方法?

zed5wv10

zed5wv101#

可以使用查询而不是聚集来获取类型的最大优先级设置。请尝试以下操作:

Query query = new Query().addCriteria(Criteria.where("type").is(setting.getType()))
                         .with(new Sort(Sort.Direction.DESC, "priority"))
                         .limit(1);
Setting setting = mongoTemplate.findOne(query, Setting.class);
if (!ObjectUtils.isEmpty(setting)) {
    baseConfig.setPriority(setting.getPriority() + 1);
} else {
    baseConfig.setPriority(1);
}

相关问题