我依靠(spring-data-mongodb)AggregationUpdate
来ConditionalOperators.switchCases
一次性更新多个文档。
这对.set
、.unset
和条件 switchCases很有效。
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
想要:如果数组字段为空或为空,则结果是一个仅包含我的新值的新数组,否则结果是使用我的新值扩充的现有数组。
.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 客户端转换器似乎未在此使用级别找到/应用,因此我发现这是解决方法。