MongoDB 更新最后一个数组元素。

9
以下文件:
{
    "_id": ObjectId("5d648b0d5aeada5177bb54e4"),
    "time": [{
            "start": "2019/8/25 9:59:30",
            "end": "2019/8/25 10:59:30"
        },
        {
            "start": "2019/8/26 9:59:30",
            "end": "2019/8/26 10:59:30"
        },
        {
            "start": "2019/8/27 9:59:30",
            "end": "2019/8/26 9:59:30"
        }
    ]
}

如何更新数组中的最后一个元素?
我已经尝试过以下操作:
db.document.update(
  {
    "_id": ObjectId("5d648b0d5aeada5177bb54e4")
  }, 
  {
    $set: {
        "time.-1.end": "2019/8/26 10:59:30"
    }
  }
)

但它并没有起作用...


我的建议有帮助吗?请告诉我,我可以将其作为答案添加吗?或者找到其他解决方案,而不是在MongoDB中使用JS,尽可能避免使用它。 - buræquete
2个回答

2
这很简单。获取最后一个元素的索引/位置即可。"Original Answer"翻译成"最初的回答"。
var data = {
"_id" : "5d648b0d5aeada5177bb54e4",
"time" : [ 
    {
        "start" : "2019/8/25 9:59:30",
        "end" : "2019/8/25 10:59:30"
    }, 
    {
        "start" : "2019/8/26 9:59:30",
        "end" : "2019/8/26 10:59:30"
    }, 
    {
        "start" : "2019/8/27 9:59:30",
        "end" : "2019/8/26 9:59:30"
    }
]
}

var len = data.time.length - 1;
var objUpdate = {};
var updateQuery = "time." + len + ".end";
objUpdate[updateQuery] = "2019/8/26 11:59:30";

db.getCollection('test').update({"_id" : ObjectId("5d648b0d5aeada5177bb54e4")}, {$set:objUpdate});

如果数组里有很多数据,那该怎么办?需要先计算索引吗? - MilanRegmi
如果您始终希望更新数组的最后一个元素,则最好按降序对数组字段进行排序,然后使用位置操作符“$”来更新第一个匹配的文档。 - Dexter
1
这个效率高吗?我会经常更新它。 - glowwormX
如果在数组字段上构建多键索引,将会提高效率。这将使排序操作变得更快。 - Dexter
1
@glowwormX 这样做会存在竞态条件,选择、索引解析和最终更新调用之间的数据更改将导致其破裂。虽然使用当前的原始mongo也无法实现您想要的功能,但是您总是可以将time数组按相反顺序排序吗?因此始终更新0th索引?当您推送新元素时,请将其推送到开头而不是结尾? - buræquete
显示剩余2条评论

1

使用time.start字段过滤文档:

尝试以下查询:

db.arraytest.updateOne({"_id" : ObjectId("5d648b0d5aeada5177bb54e4"), "time.start" : "2019/8/27 9:59:30"},
{$set: { "time.$.end": "2019/8/26 10:59:30" }})

有时候该字段的值是未知的。 - glowwormX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接