javascript 将以下MongoDB更新语句转换为SpringBoot等效语句

nuypyhwy  于 2023-01-29  发布在  Java
关注(0)|答案(1)|浏览(120)

我正尝试使用这里建议的索引从文档内的列表中删除元素

db.example.update({}, [
     {$set:{ sequence: {
           $concatArrays:[ 
               {$slice:[ "$sequence", P ]}, 
               {$slice:[ "$sequence", {$add:[1,P]}, {$size:"$sequence"}]}
           ]
     }}}
]);

但是,在尝试将查询转换为Spring语法等价物时遇到了问题:

Update update = new Update();

/*how do I pass the slice in the following statement?*/
ArrayOperators.ConcatArrays array = ArrayOperators.ConcatArrays.arrayOf(****);
SetOperators.SetUnion setUnion = SetOperators.SetUnion.arrayAsSet(** slice with add and size***).union(array);
update.set("sequence", setUnion);

谢谢

puruo6ea

puruo6ea1#

$concatArrays的第二个参数应该如下所示。

ArrayOperators.Slice.sliceArrayOf("sequence")
.offset(P+1)
.itemCount(ArrayOperators.Size.lengthOfArray("sequence"));

不幸的是,itemCount只接受int参数,所以这是行不通的。
如果数组具有不同的元素,则可以尝试使用此修改后的查询。

db.collection.update({},
[
  {
    "$set": {
      "sequence": {
        "$concatArrays": [
          {
            "$slice": ["$sequence",P]
          },
          {
            "$setDifference": [
              "$sequence",
              {
                "$slice": ["$sequence",{$add:[P,1]}]
              }
            ]
          }
        ]
      }
    }
  }
])

Demo
由于需要流水线更新,因此需要使用AggregationUpdate

AggregationUpdate update = Aggregation.newUpdate()
    .set("sequence")
    .toValue(ArrayOperators.ConcatArrays
        .arrayOf(ArrayOperators.Slice.sliceArrayOf("sequence").itemCount(P))
        .concat(SetOperators.SetDifference.arrayAsSet("sequence")
            .differenceTo(ArrayOperators.Slice.sliceArrayOf("sequence").itemCount(P+1))));

另一种更简单的方法是在javascript中使用$function执行此操作

db.collection.update({},[
{
    $set: {
        "sequence": {
            $function: {
                body: function(sequence) {
                    sequence.splice(P,1);
                    return sequence;
                },
                args: ["$sequence"],
                lang: "js"
            }
        }
    }
}
]);

Demo

AggregationUpdate update = Aggregation.newUpdate()
    .set("sequence")
    .toValue(ScriptOperators
        .function("function(sequence) {\r\n" 
            + "  sequence.splice(P,1);\r\n"
            + "  return sequence;\r\n" 
            + "}")
        .args("$sequence")
        .lang("js"));

相关问题