#mongodb #php-mongodb
Вопрос:
Я пытаюсь обновить массив поддокументов в PHP Mongo
$result = $collection->updateMany(
[
'_id' => new MongoDBBSONObjectID('61613dcd437b996bc227ffe2'),
'messages.type' => 'test'
],
['$set' => ['messages.$[m].direction' => '999']],
[
'multi' => true,
'arrayFilters' => [['m.type'=> 'test']]
]
);
####Обновление . Мой массив таков
[{«_id»:{«$oid»: «6163f2c9fc197a54f03ca8c8″},»идентификатор»:7,},»сообщения»:{«1»:{«тип»:»1″,»время»:»19.04.2020 09:14:42″,»сообщение»:»Это testmsg»}},»ssg»:»резерв»}]
Кроме того, Как я могу обновить весь поддокумент с индексами 1,2,3.. и так далее ?
Комментарии:
1. Почему вы храните числовые значения в виде строки? И почему вы храните
Date
значения в виде строки? Используйте правильные типы данных , тогда ваш запрос будет работать.2. Для использования с датой
new MongoDBBSONUTCDateTime($value)
см. php.net/manual/de/class.mongodb-bson-utcdatetime.php
Ответ №1:
использовать $[]
и arrayFilters
db.collection.update({
"_id": ObjectId("61603458c08ad41af13bf352"),
"messages.type": "05.04.2020 03:27:23"
},
{
$set: {
"messages.$[m].direction": "999"
}
},
{
multi: true,
arrayFilters: [
{
"m.type": "05.04.2020 03:27:23"
}
]
})
Обновить
Если вы хотите заменить этот единственный массив сообщений новым
$set: {
"messages.$[m]": {
"type": "02.06.2020 19:27:23",
"message": "This is a 3 Msg",
"direction": "0"
}
}
Комментарии:
1. Но это бес, чтобы использовать _id с messages.type. Это нормально, если я объединюсь с _id ?
2. Кроме того, как я могу обновить весь вложенный документ ? т. Е. Я хочу заменить этот массив сообщений на новый (вместо замены столбца с одним типом)
3. Конечно, вы можете, я обновляю свой ответ.
4. Привет, @YuTing. Ваш запрос работает. Но не могли бы вы, пожалуйста, помочь. как я обрабатываю вложенный массив документов «сообщения»:{«1»:{«тип»:»заметки»,»время»:»19.04.2020 09:14:42″,»сообщение»:»fakemsg»,»направление»:»0″}}
5. Как я могу обновить весь поддокумент с индексами 1,2,3.. и так далее. Пожалуйста, проверьте мой вопрос