Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ArrayFilter的PHP MongoDB$集_Php_Mongodb - Fatal编程技术网

使用ArrayFilter的PHP MongoDB$集

使用ArrayFilter的PHP MongoDB$集,php,mongodb,Php,Mongodb,我正在尝试使用带有ArrayFilter的$set运算符更新“attributes”中“position”的值 下面的命令在终端上按预期工作 db.produtos.insert( { "_id": 1, "nome":"Nome do Produto", "descricao":"Lorem ipsum dolor sit amet.", "atributos": [ { "id" : 1, "posicao" : 2 }, { "i

我正在尝试使用带有ArrayFilter的$set运算符更新“attributes”中“position”的值

下面的命令在终端上按预期工作

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中创建相同的命令时,它不起作用

在我的测试中,文档被找到,但从未更新

只是为了解释一下,我得到了一个字符串的“attributes.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);