MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB $set aktualisiert den Datensatz nicht

Ich habe einige Nachforschungen angestellt, warum das passiert. Und ich glaube nicht, dass ich einen Weg finden kann, wie ich dieses Problem "beheben" kann.

JavaScript unterscheidet zwischen Arrays und assoziativen Arrays/Objekten. PHP unterscheidet zwischen Arrays und Objekten. Für PHP ist ein assoziatives Array ein Array und für JavaScript ein Objekt.

Wenn der PHP-Treiber ein Array in ein JSON-Objekt konvertieren muss, versucht er herauszufinden, ob ein Array eines der folgenden ist:ein normales Array mit fortlaufend nummerierten Schlüsseln, beginnend mit 0; oder ein assoziatives Array. Die aktuelle Implementierung betrachtet jedes Array mit fortlaufend nummerierten Schlüsseln, beginnend bei 0, als ein normales Array. Und ein normales Array enthält keine Schlüssel . Und das ist das Problem. In der Situation, in der der Treiber ein normales Array sieht, gibt es keine Feldnameninformationen im BSON, das an den Server gesendet wird, und daher kann der Server ein Feld nicht aktualisieren.

Ich kann mir keine Möglichkeit vorstellen, dieses Verhalten zu ändern, ohne bestehenden Code zu beschädigen. Wenn Sie also numerische Feldnamen wünschen, müssen Sie ein stdClass-Objekt für das "Hauptdokument" verwenden. Alternativ könnten Sie diese Schlüssel in ein eingebettetes Dokument verschieben und dann aktualisieren:

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