sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB $set no actualiza el registro

Estoy investigando por qué sucede esto. Y no creo que pueda encontrar una manera de "arreglar" este problema.

JavaScript tiene una diferencia entre matrices y matrices/objetos asociativos. PHP tiene la diferencia entre matrices y objetos. Para PHP, una matriz asociativa es una matriz y para JavaScript es un objeto.

Cuando el controlador de PHP necesita convertir una matriz en un objeto JSON, intenta averiguar si una matriz es:una matriz normal con claves numeradas secuencialmente que comienzan con 0; o una matriz asociativa. La implementación actual considera cualquier matriz con claves numeradas secuencialmente, comenzando desde 0 como una matriz normal. Y una matriz normal no contiene claves . Y este es el problema. En la situación en que el controlador ve una matriz normal, no hay información de nombre de campo en el BSON que se envía al servidor y, por lo tanto, el servidor no puede actualizar un campo.

No puedo pensar en una manera de cambiar este comportamiento sin romper ningún tipo de código existente. Entonces, si desea nombres de campo numéricos, deberá usar un objeto stdClass para el "documento principal". Alternativamente, puede insertar esas claves en un documento incrustado y luego actualizar:

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