我依靠 (spring-data-mongodb)
AggregationUpdate
和 ConditionalOperators.switchCases
来一次性更新多个文档。
这对于
.set
、.unset
和条件 switchCases 非常有效..
参见。 doc 或我的示例如下:
AggregationUpdate update = AggregationUpdate.update()
.set("updateTs").toValue(updateTs)
.set("result").toValue(
ConditionalOperators.switchCases(
CaseOperator.when(In.arrayOf("$myArray.state").containsValue("VALA")).then("VALA"),
CaseOperator.when(In.arrayOf("$myArray.state").containsValue("VALB")).then("VALB")
).defaultTo("UNKNOWN")
)
.unset("updateRequested");
UpdateResult result = mongoTemplate.updateMulti(query, update, ResultDocument.class);
但是现在,我想在现有更新中添加
push
操作,
理想的是这样的:
// .push("dtArray", newDTValueToPush);// no
// .set("dtArray").toValueOf(Aggregation.group("dtArray").push(newDTValueToPush));// unexpected usage
想要:如果数组字段为 null 或空,则结果是一个仅包含我的新值的新数组,否则结果是用我的新值扩充的现有数组。
.set("myArray").toValue(
ConcatArrays.arrayOf("myArray")
.concat(ConcatArrays.arrayOf(List.of("a","b")))
);
这对于平坦的简单值来说效果很好,
但是如果数组条目是
OffsetDateTime
,这不起作用,
我有一个 'Can't find a codec for CodecCacheKey{clazz=class java.time.OffsetDateTime, types=null}.'
(我已经在 mongo 客户端配置中声明并使用了 DateToOffsetDateTimeConverter
和 OffsetDateTimeToDateConverter
..)
但是如何用
AgregationUpdate
做到这一点?
OffsetDateTime newEntry = OffsetDateTime.now(ZoneOffset.UTC);
(...)
.set("dtArray").toValue(
ConcatArrays.arrayOf("dtArray")
.concat(ConcatArrays.arrayOf(List.of(
Objects.requireNonNull(new OffsetDateTimeToDateConverter().convert(
newEntry
))
)))
);
由于某种原因,mongo客户端转换器似乎在这个使用级别上没有找到/应用,所以我发现这是解决方法。