Spring应用中MongoDB的findAndModify操作执行失败原因排查
问题排查结果
核心原因
Update.set()方法误用
你通过update.set("conversionRate", new Document("$divide", Arrays.asList("$clicks", "$views")))传入MongoDB聚合操作符,但Update.set()的设计是用来设置静态固定值,而非执行动态聚合计算。Spring Data MongoDB会将这个包含$divide的Document对象当作普通Java对象处理,尝试将其映射到实体类中Float类型的conversionRate字段,类型不匹配直接触发映射异常。聚合表达式不兼容普通更新语法
MongoDB的聚合操作符(如$divide)不能直接用在常规的set更新操作中。这类表达式需要使用支持聚合更新的语法才能被MongoDB服务器正确解析执行,而非作为字段值传入。
问题背景回顾
执行代码
import org.bson.Document; import org.bson.types.ObjectId; import org.springframework.data.mongodb.core.FindAndModifyOptions; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; private CampaignEntity incrByWithConversionRate(ObjectId campaignId, String key) { Query query = new Query(); query.addCriteria(Criteria.where("id").is(campaignId)); Update update = new Update(); update.inc(key); update.set("conversionRate", new Document("$divide", Arrays.asList("$clicks", "$views"))); return mongoTemplate.findAndModify( query, update, new FindAndModifyOptions().returnNew(true), CampaignEntity.class); }
错误日志
org.springframework.data.mapping.MappingException: Expected to read Document Document{{$divide=[$clicks, $views]}} into type class java.lang.Float but didn't find a PersistentEntity for the latter!
实体类定义
@Data @Document(collection = "campaigns") public abstract class CampaignEntity extends BaseEntity { private Integer clicks = 0; private Integer views = 0; private Float conversionRate; }
内容的提问来源于stack exchange,提问作者Ariel Malka
相关产品推荐
相关产品推荐

