MongoDB更新属性嵌套数组

时间:2014-06-26 20:56:17

标签: mongodb mongodb-query

我目前有一个结构如下的数据库......

"_id" : "neRmMTTkRvoKFGL3a",
"active_users" : [
            {
                    "user" : {
                            "_id" : "CYyxPcAnfhns28stb",
                            ...
                    },
                    "last_seen" : 1403814568360
            },
            {
                Other users....
            }
],
"room_name": "TestRoom"

我希望能够更新last_seen属性。我一直在尝试使用以下查询(或其变体)但到目前为止没有运气。任何帮助将不胜感激。

db.rooms.update({room_name: "TestRoom",
                'active_users.user._id': 'CYyxPcAnfhns28stb'
                }, {$set: {'active_users.last_seen.$': Date.now()}})

1 个答案:

答案 0 :(得分:2)

位置运算符($)位于错误的位置。这段代码应该有效:

db.rooms.update({room_name: "TestRoom",
                'active_users.user._id': 'CYyxPcAnfhns28stb'
                }, {$set: {'active_users.$.last_seen': Date.now()}})

位置运算符标识数组中的元素。在您的情况下,active_users是数组。如果您知道元素的位置,则可以使用其索引:

'active_users.1'
      ^       ^
    array   index

这引用了数组中的第一个元素:

{
        "user" : {
                "_id" : "CYyxPcAnfhns28stb",
                ...
        },
        "last_seen" : 1403814568360
}

如果您不知道索引,则需要使用位置运算符$

'active_users.$'
      ^       ^
    array   index

此位置运算符引用查询中匹配的数组中的元素('active_users.user._id': 'CYyxPcAnfhns28stb')。

然后在更新查询中,您要更新last_seen字段。所以它变成了:

'active_users.$.last_seen'
      ^       ^     ^
    array   index field