PHP MongoDB $ set使用arrayFilters

时间:2018-09-25 21:49:12

标签: php mongodb

我正在尝试使用带有数组过滤器的$ set运算符来更新“属性”中“位置”的值。

下面的命令在终端上可以正常工作

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);

0 个答案:

没有答案