Jag har undersökt varför detta händer. Och jag tror inte att jag kan hitta ett sätt att "lösa" det här problemet.
JavaScript har en skillnad mellan arrayer och associativa arrayer/objekt. PHP har skillnaden mellan arrayer och objekt. För PHP är en associativ array en array, och för JavaScript är det ett objekt.
När PHP-drivrutinen behöver konvertera en array till ett JSON-objekt, försöker den ta reda på om en array är antingen:en normal array med sekventiellt numrerade nycklar som börjar med 0; eller en associativ array. Den nuvarande implementeringen avser alla arrayer med sekventiellt numrerade nycklar, med start från 0 en normal array. Och en normal array innehåller inte nycklar . Och detta är problemet. I den situation som drivrutinen ser en normal array finns det ingen fältnamnsinformation i BSON som skickas till servern, och därför kan servern inte uppdatera ett fält.
Jag kan inte komma på ett sätt att ändra detta beteende utan att bryta någon form av befintlig kod. Så om du vill ha numeriska fältnamn måste du använda ett stdClass-objekt för "huvuddokumentet". Alternativt kan du trycka in dessa nycklar i ett inbäddat dokument och sedan uppdatera:
<?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); ?>