PHP MongoDB $ устанавливается с помощью arrayFilters - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь обновить значение «position» в «attribute», используя оператор $ set с arrayFilters.

Команда ниже работает, как и ожидалось, на терминале

db.produtos.insert(
  {
    "_id": 1,
    "nome":"Nome do Produto",
    "descricao":"Lorem ipsum dolor sit amet.",
    "atributos": [
      { "id" : 1, "posicao" : 2 },
      { "id" : 2, "posicao" : 1 },
      { "id" : 3, "posicao" : 3 }
    ]
  }
)

db.produtos.update(
  {"_id": 1 },
  {
    $set: {
      "atributos.$[elem1].posicao": 1,
      "atributos.$[elem2].posicao": 2,
      "atributos.$[elem3].posicao": 3
    }
  },
  {
     arrayFilters: [ 
       { "elem1.id": 1 },
       { "elem2.id": 2 },
       { "elem3.id": 3 },
     ]
   }
)

Но когда я пытаюсь создать ту же команду в PHP, она не работает.

В моих тестах документ найден, но никогда не обновляется.

Просто, чтобы объяснить, я получаю "атрибуты".id "из строки, я монтирую массив с обновлением, а другой для фильтрации

<?php
$ids = explode(',', '1,2,3');

$update  = [];
$filters = [];

$i = 1;
foreach ($ids as $linha) :
   $update['atributos.$[elem'.$i.'].posicao'] = $i;

   $filters[]['elem'.$i.'.id'] = $linha;

   $i++;
endforeach;

$conexao = new MongoDB\Driver\Manager('mongodb://localhost:27017');

$cmd = new MongoDB\Driver\Command(
  [
    'findAndModify'  => 'produtos',
    'query'          => ['_id' => 1],
    'update'         => ['$set' => $update],
    'upsert'         => true,
    'returnDocument' => true,
    'new'            => true,
    'arrayFilters'   => $filters,
  ]
);

$result = $conexao->executeCommand('teste', $cmd)->toArray();
$result = json_decode(json_encode($result), true);

echo '<pre>';
print_r($cmd);
print_r($result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...