spring data AggregationUpdate:如何将新值推送到数组

问题描述 投票:0回答:1

我依靠 (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
做到这一点?

java mongodb spring-boot spring-data-mongodb
1个回答
0
投票
       OffsetDateTime newEntry = OffsetDateTime.now(ZoneOffset.UTC);
       (...)
        .set("dtArray").toValue(
                ConcatArrays.arrayOf("dtArray")
                        .concat(ConcatArrays.arrayOf(List.of(
                                Objects.requireNonNull(new OffsetDateTimeToDateConverter().convert(
                                        newEntry 
                                ))
                        )))
        );

由于某种原因,mongo客户端转换器似乎在这个使用级别上没有找到/应用,所以我发现这是解决方法。

© www.soinside.com 2019 - 2024. All rights reserved.