我正在尝试使用带有数组过滤器的$ 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);