Добавление к массиву в MongoDB (PHP 7.2) - PullRequest
0 голосов
/ 09 июля 2019

push() операция будет добавлять данные, я знаю.Но я сталкиваюсь со странной проблемой.У меня очень простой и понятный скрипт PHP.Он получает JSON, основываясь на нем, он ищет запись в MongoDB и затем обновляет определенное место.

Это мой JSON MongoDB:

{
  "_id": "5d246a404ddb5c24231eb3f2",
  "series_id": "GY5VKE9EY",
  "episodes": {
    "3x": {
      "My First Title": [
        {
          "offsetLeft": 157,
          "offsetTop": -1,
          "episode_number": "50"
        }
      ]
    }
  }
}

Теперь я хочу добавитьновая запись в ключе My First Title.У меня есть этот JSON, который я хочу добавить.

{
  "offsetLeft": 157,
  "offsetTop": -1,
  "episode_number": "50"
}

Сценарий, который я написал, когда я даю ему этот JSON, говорит, что документ обновлен.Однако он никогда не обновлялся, когда я регистрировался в БД.

Вот мой PHP-код:

try{

    $encoded_json = json_encode($final_array_to_update);
    $internal_json = array("episodes" => array($key_value => $encoded_json));
    $collection->updateOne(
        array("_id" => $_id),
        array('$push' => $internal_json)
    );
    echo "Updated The Document.";
}
catch (Exception $ex)
{
    echo $ex;
}

Кроме того, по какой-то странной причине теперь ошибка изменилась на:

BulkWriteException: The field 'episodes' must be an array but is of type object in document

Я не уверен, в чем проблема.Может ли кто-нибудь помочь мне с этим.

1 Ответ

0 голосов
/ 10 июля 2019

Оператор $ push * MongoDB используется для добавления указанного значения в массив .

Согласно документации, оператор $ push sintax имеет вид:

{ $push: { <field1>: <value1>, ... } }

Итак, сообщение об ошибке очень ясно: вы пытаетесь $ push что-то в поддокумент эпизодов , когда вы действительно хотите добавить данные в массив My Первый заголовок .

Попробуйте это:

$final_array_to_update = [
    'offsetLeft' => 157,
    'offsetTop' => -1,
    'episode_number' => '50'
];   

// index is the path to the array - value is the array to push
$update = [
    'episodes.3x.My First Title' => $final_array_to_update 
];

$collection->update(
    ['_id' => $_id],
    ['$push' => $update]
);
...