Вложенный массив атрибутов обновления MongoDB

#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. Это сработало отлично! Не могли бы вы объяснить, почему это так, а не то, что у меня было изначально?