You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring应用中MongoDB的findAndModify操作执行失败原因排查

问题排查结果

核心原因

  1. Update.set()方法误用
    你通过update.set("conversionRate", new Document("$divide", Arrays.asList("$clicks", "$views")))传入MongoDB聚合操作符,但Update.set()的设计是用来设置静态固定值,而非执行动态聚合计算。Spring Data MongoDB会将这个包含$divide的Document对象当作普通Java对象处理,尝试将其映射到实体类中Float类型的conversionRate字段,类型不匹配直接触发映射异常。

  2. 聚合表达式不兼容普通更新语法
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 07:15:11