更新 mongodb 中嵌套数组的最后一个元素

Update last element of a nested array in mongodb

我试过下面的 mongoose 查询,但似乎不起作用:

Model.findOneAndUpdate(
    {
        name: origin
    },
    {
        $set: {
            'field1.$[id1].field2.-1': "value"
        }
    },
    {
        arrayFilters: [
            { 'id1.userId': "customerId" }
        ],
        new: true
    }
);

Note: field1 and field2 are arrays

MongoDB 不接受负索引,这导致了问题。

您可以考虑使用 $set (aggregation) operator and use double $map 运算符:

db.collection.aggregate([
    { $match: { name: "myname" } }
    {
        $set: {
            field1: {
                $map: {
                    input: "$field1",
                    in: {
                        $cond: {
                            if: { $ne: [ "$$this.userId", "customerId" ] },
                            then: "$$this",
                            else: {
                                $mergeObjects: [
                                    "$$this",
                                    { 
                                        field2: { 
                                            $concatArrays: [
                                                { $slice: [ "$$this.field2", { $add: [ { $size: "$$this.field2" }, -1 ] } ] },
                                                ["value"]
                                            ]
                                        } 
                                    }
                                ]
                            }
                        }
                    }
                }
            }
        }
    }
])

Mongo Playground

在更新中应用 $set 运算符和 $ 位置运算符来更改名称字段。

$ 位置运算符将识别数组中要更新的正确元素,而无需明确指定元素在数组中的位置,因此您的最终更新语句应如下所示:

db.collection.update(
    { "friends.u.username": "michael" }, 
    { "$set": { "friends.$.u.name": "hello" } }
)

答案取自 -