MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB $set non aggiorna il record

Sto facendo alcune indagini sul motivo per cui questo accade. E non credo di poter trovare un modo su come "risolvere" questo problema.

JavaScript ha una differenza tra array e array/oggetti associativi. PHP ha la differenza tra array e oggetti. Per PHP un array associativo è un array e per JavaScript è un oggetto.

Quando il driver PHP deve convertire un array in un oggetto JSON, cerca di capire se un array è:un array normale con chiavi numerate in sequenza che iniziano con 0; o un array associativo. L'attuale implementazione riguarda qualsiasi array con chiavi numerate in sequenza, a partire da 0 un normale array. E un array normale non contiene chiavi . E questo è il problema. Nella situazione in cui il driver vede un array normale, non ci sono informazioni sul nome del campo nel BSON inviato al server e quindi il server non può aggiornare un campo.

Non riesco a pensare a un modo per modificare questo comportamento senza interrompere alcun tipo di codice esistente. Quindi, se vuoi nomi di campo numerici, dovrai usare un oggetto stdClass per il "documento principale". In alternativa, puoi inserire queste chiavi in ​​un documento incorporato e quindi aggiornare:

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