#mongodb #mongodb-query
#mongodb #mongodb-запрос
Вопрос:
В настоящее время у меня есть база данных, которая структурирована следующим образом…
"_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:
Позиционный оператор ( $
) находится не в том месте. Этот код должен работать:
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
Комментарии:
1. Это сработало отлично! Не могли бы вы объяснить, почему это так, а не то, что у меня было изначально?