Если вы читаете свою команду, вы на самом деле говорите: "ОБНОВЛЕНИЕ ГДЕ uname = Eamorr3 SET сообщения, равные этому массиву (id = blah, read = 1)"
Когда вы делаете $set
на messages
, вы в основном указываете ему, что ваш массив должен быть принят за новое значение.
Однако похоже, что вы пытаетесь обновить определенное сообщение как прочитанное, которое немного сложнее. Итак, здесь есть два препятствия:
1: Вы на самом деле обновляете messages.0.read
Если вы сделаете array('$set' => array( 'messages.0.read' => 1 ) )
, вы обновите правильный элемент. Следуя этой цепочке, messages
является объектом javascript, и вы хотите обновить свойство 0
. Свойство 0
само по себе является объектом javascript, который содержит свойство read
, которое вы хотите обновить.
Вы видите, как вы обновляете messages.0.read
?
Это подводит нас к проблеме № 2.
2: 0
- это проблема для вас
Если вы посмотрите на то, как вы структурировали данные в Mongo, объект messages действительно не соответствует. «0» и «1» в настоящее время действуют как «идентификаторы», и они не очень полезны. Лично я бы структурировал ваши объекты по фактическим идентификаторам вместо «0» или «1».
Таким образом, ваши объекты будут выглядеть следующим образом:
{
"_id": ObjectId("4d0b9c7a8b012fe287547157"),
"messages": {
"ABCDZZZ": {
"toUname": "Eamorr3",
"fromUname": "Eamorr2",
"time": 1292606586,
"subject": "asdf",
"message": "asdf",
"read": 0 //I want to change this to 1!
}
},
"uname": "Eamorr3"
}
Теперь ваша команда обновления становится такой:
array('$set' => array( 'messages.ABCDZZZ.read' => 1 ) )
Эта структура значительно упрощает обновление определенного сообщения или определенной части сообщения.