MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB $ set não atualizando registro


Estou fazendo algumas investigações sobre por que isso acontece. E acho que não consigo encontrar uma maneira de "consertar" esse problema.

JavaScript tem uma diferença entre arrays e arrays/objetos associativos. PHP tem a diferença entre arrays e objetos. Para PHP um array associativo é um array, e para JavaScript é um objeto.

Quando o driver PHP precisa converter um array em um objeto JSON, ele tenta descobrir se um array é:um array normal com chaves numeradas sequencialmente começando com 0; ou uma matriz associativa. A implementação atual considera qualquer array com chaves numeradas sequencialmente, começando em 0 um array normal. E um array normal não contém chaves . E esse é o problema. Na situação em que o driver vê uma matriz normal, não há informações de nome de campo no BSON que são enviadas ao servidor e, portanto, o servidor não pode atualizar um campo.

Não consigo pensar em uma maneira de alterar esse comportamento sem quebrar nenhum tipo de código existente. Portanto, se você quiser nomes de campos numéricos, terá que usar um objeto stdClass para o "documento principal". Como alternativa, você pode enviar essas chaves para um documento incorporado e atualizar:
<?php
$m = new Mongo;
$collection = $m->demo->testcollection;

$collection->insert(array(
    "_id" => 'bug341',
    'data' => array( 0, 1, 1, 2, 3, 5 )
));

$obj = $collection->findOne();

$update = array('data.0' => 'zero int');

$collection->update(
    array( '_id' => 'bug341' ),
    array( '$set' => $update )
);


$obj = $collection->findOne();
var_dump($obj);
?>