node.js - Mongoose - 更新数组中的最后一个元素(使用聚合器更新文档)
问题描述
我的问题以此为基础:仅获取数组 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
负索引?
解决方案
从 v4.2 开始,MongoDB 没有直接的方法来按索引更新数组元素。
但是从 v4.2 开始,您可以使用带有聚合管道的更新,它允许您基于当前数组构造一个新数组并替换当前数组。
您可以构造一个新数组,而不是修改最后一个元素,该数组由第一个顶部n - 1
元素与一个新元素组合而成{ status: "terminated" }
。
您可以通过使用$slice
获取顶部n - 1
元素并使用与新元素结合来实现此目的$concatArrays
这假设元素仅包含status
您要更新的字段包含多个字段的数组元素的字段,您需要使用将更新的字段与当前元素合并$mergeObjects
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
]
}
}
}])
推荐阅读
- shell - 从ubuntu中的csv中删除重复的列
- c++ - 无法让 SDL2 在 Windows 10 上与 MinGW、VSCode 和 CMake 一起使用
- powershell - 在应用程序崩溃的信息亭模式下停止重启循环
- javascript - 如何知道lightbox2是否已加载或关闭
- php - 如何更改下拉菜单以在单击而不是悬停时打开?
- r - 在R中cbind tibble和matrix时不一致
- angular - 隐藏登录组件的标题
- java - 创建数据库后的休眠更新索引或约束
- javascript - 在 xAxis 和 svg 线 D3 之间添加空间
- security - 是否需要强制新注册的用户登录?