将MongoDB按索引删数组元素的更新语句转为SpringBoot实现
Spring Data MongoDB 按索引删除数组元素
你原来的MongoDB更新语句是通过$concatArrays拼接两个$slice结果,实现删除数组sequence中索引为P的元素。对应的Spring Data MongoDB代码不需要用SetUnion(这是集合操作,和你的需求不匹配),直接用ArrayOperators里的ConcatArrays和Slice即可实现,完整代码如下:
import org.springframework.data.mongodb.core.aggregation.ArrayOperators; import org.springframework.data.mongodb.core.query.Update; import org.springframework.data.mongodb.core.aggregation.AggregationExpression; // 假设P是你要删除的元素索引,比如int P = 2; int P = 2; Update update = new Update(); // 第一个切片:取sequence数组的前P个元素 ArrayOperators.Slice firstSlice = ArrayOperators.Slice.arrayOf("sequence").elementCount(P); // 第二个切片:从P+1的位置开始,取到数组末尾 AggregationExpression startIndex = ctx -> ctx.add(1).addValue(P).toDocument(ctx); AggregationExpression sliceLength = ctx -> ctx.sizeOfArray("sequence").toDocument(ctx); ArrayOperators.Slice secondSlice = ArrayOperators.Slice.arrayOf("sequence") .startingAt(startIndex) .elementCount(sliceLength); // 拼接两个切片,替换原sequence数组 update.set("sequence", ArrayOperators.ConcatArrays.arrayOf(firstSlice).concat(secondSlice)); // 执行更新(示例用updateMulti更新所有文档,根据你的需求换成updateFirst等) // mongoTemplate.updateMulti(new Query(), update, ExampleEntity.class);
代码说明:
- 第一个
Slice直接取数组的前P个元素,对应MongoDB的{$slice: ["$sequence", P]} - 第二个
Slice的起始位置用AggregationExpression构建{$add: [1, P]},长度用sizeOfArray获取原数组长度,对应MongoDB的{$slice: ["$sequence", {$add:[1,P]}, {$size:"$sequence"}]} - 最后用
ConcatArrays把两个切片结果拼接,覆盖原sequence字段,实现删除指定索引元素的效果
内容的提问来源于stack exchange,提问作者Luis Lavieri
相关产品推荐
相关产品推荐

