我的问题是基于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
与否定索引一起使用?
答案 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
]
}
}
}])