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

我依靠(spring-data-mongodb)AggregationUpdateConditionalOperators.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 客户端配置中声明并使用DateToOffsetDateTimeConverterOffsetDateTimeToDateConverter..)

但如何使用 来实现这一点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 客户端转换器似乎未在此使用级别找到/应用,因此我发现这是解决方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

肉三

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值