Jeg har lavet nogle undersøgelser af, hvorfor det sker. Og jeg tror ikke, jeg kan finde en måde at "løse" dette problem på.
JavaScript har en forskel mellem arrays og associative arrays/objekter. PHP har forskellen mellem arrays og objekter. For PHP er et associativt array et array, og for JavaScript er det et objekt.
Når PHP-driveren skal konvertere et array til et JSON-objekt, forsøger den at finde ud af, om et array er enten:et normalt array med sekventielt nummererede nøgler, der starter med 0; eller et associativt array. Den nuværende implementering vedrører ethvert array med sekventielt nummererede nøgler, startende fra 0 til et normalt array. Og et normalt array indeholder ikke nøgler . Og dette er problemet. I den situation, hvor driveren ser et normalt array, er der ingen feltnavninformation i BSON'en, der sendes til serveren, og serveren kan derfor ikke opdatere et felt.
Jeg kan ikke komme i tanke om en måde at ændre denne adfærd på uden at bryde nogen form for eksisterende kode. Så hvis du vil have numeriske feltnavne, skal du bruge et stdClass objekt til "hoveddokumentet". Alternativt kan du skubbe disse nøgler ind i et indlejret dokument og derefter opdatere:
<?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); ?>