如何在Spring Data MongoDB的AggregationUpdate中向数组推送新值
解决方案
1. 利用MongoDB原生$push的自动行为
MongoDB的$push操作符本身就满足你的需求:
- 当目标字段为
null或不存在时,自动创建一个仅包含新值的数组 - 当目标字段已是数组时,直接追加新值
无需手动写条件判断,直接使用AggregationUpdate的push方法即可,关键是要将OffsetDateTime转换为MongoDB支持的Date类型(你的实体Converter仅作用于实体和文档的映射,不覆盖聚合表达式中的类型转换)
代码示例:
// 待添加的OffsetDateTime值 OffsetDateTime newEventTime = OffsetDateTime.now(); // 转换为MongoDB支持的Date类型 Date newEventDate = Date.from(newEventTime.toInstant()); // 构建AggregationUpdate AggregationUpdate update = AggregationUpdate.update() // 直接使用push操作,MongoDB会自动处理数组为空/ null的情况 .push("yourArrayField").value(newEventDate);
2. 自定义条件分支(可选)
如果业务需要手动控制条件逻辑,可使用ConditionalOperators结合ArrayOperators,同样要确保传入的是Date类型:
AggregationUpdate update = AggregationUpdate.update() .set("yourArrayField", ConditionalOperators.ifNull("yourArrayField") // 数组为null时,创建含新值的数组 .then(Collections.singletonList(newEventDate)) // 数组存在时,追加新值 .otherwise(ArrayOperators.ConcatArrays.arrayOf("yourArrayField").concat(Collections.singletonList(newEventDate))) );
3. 关于Codec错误的原因
你配置的DateToOffsetDateTimeConverter和OffsetDateTimeToDateConverter是用于实体类与MongoDB文档之间的映射转换,仅在读写实体对象时生效。而AggregationUpdate中的表达式参数是直接传递给MongoDB聚合框架的,MongoDB原生不支持Java的OffsetDateTime类型,因此需要手动转换为Date后再传入。
内容的提问来源于stack exchange,提问作者boly38
相关产品推荐
相关产品推荐

