Обновление массива вложенных документов в PHP Mongo

#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"
    }
  }
 

mongoplayground

Комментарии:

1. Но это бес, чтобы использовать _id с messages.type. Это нормально, если я объединюсь с _id ?

2. Кроме того, как я могу обновить весь вложенный документ ? т. Е. Я хочу заменить этот массив сообщений на новый (вместо замены столбца с одним типом)

3. Конечно, вы можете, я обновляю свой ответ.

4. Привет, @YuTing. Ваш запрос работает. Но не могли бы вы, пожалуйста, помочь. как я обрабатываю вложенный массив документов «сообщения»:{«1»:{«тип»:»заметки»,»время»:»19.04.2020 09:14:42″,»сообщение»:»fakemsg»,»направление»:»0″}}

5. Как я могу обновить весь поддокумент с индексами 1,2,3.. и так далее. Пожалуйста, проверьте мой вопрос