猫鼬-更新数组中的最后一个元素(使用聚合器更新文档)

时间:2020-07-05 21:37:46

标签: node.js mongodb mongoose

我的问题是基于Get only the last element of array mongoose。但是,我使用的是Mongoose,还想更新该数组最后一个元素中的字段,而不仅仅是检索它。

如何修改rounds数组中的最后一个元素/对象,从status: started更改为status: terminated

要修改的文档

{
    "_id" : "8844d3f2d25f45df8105db1ab058d7d6",
    "rounds" : [ 
        { "status" : "offline" },
        { "status" : "paused" },
        { "status" : "started" }
    ],
    "updatedAt" : ISODate("2020-07-05T21:21:58.823Z")
}

好像使用负索引将使此操作变得容易,从而允许修改n-1元素。我已经看到许多问题提到聚合,但是都没有修改基础数据。我想将汇总与更新文档结合起来。

是否可以将$set与否定索引一起使用?

1 个答案:

答案 0 :(得分:0)

从v4.2开始,MongoDB还没有直接通过索引更新数组元素的方法。

不过,从v4.2开始,您可以使用updates with aggregation pipeline,它允许您基于当前数组构造一个新数组并替换当前数组。

代替修改最后一个元素,您可以构造一个由第一个顶部n - 1元素和一个新元素{ status: "terminated" }组成的新数组。

您可以通过使用$slice来获取顶部的n - 1元素并使用$concatArrays与新元素组合来实现此目的

这假定元素仅包含要更新的数组元素中包含多个字段的字段status,您需要使用{{3}将更新后的字段与当前元素合并}

Model.updateOne({ // or updateMany with your condition
  _id: "8844d3f2d25f45df8105db1ab058d7d6"
}, [{
  $set: {
    rounds: {
      $concatArrays: [ // combine arrays
        {
          $slice: [ // get the top n - 1 elements
            "$rounds",
            { $subtract: [{ $size: "$rounds" }, 1] }
          ]
        },,
        [{ status: "terminated" }] // a new element to replace the last element
      ]
    }
  }
}])