Saya telah melakukan beberapa penyelidikan mengapa ini terjadi. Dan saya rasa saya tidak dapat menemukan cara untuk "memperbaiki" masalah ini.
JavaScript memiliki perbedaan antara array dan array/objek asosiatif. PHP memiliki perbedaan antara array dan objek. Untuk PHP array asosiatif adalah array, dan untuk JavaScript itu adalah objek.
Ketika driver PHP perlu mengonversi larik ke objek JSON, ia mencoba mencari tahu apakah larik adalah:larik normal dengan kunci bernomor urut yang dimulai dengan 0; atau array asosiatif. Implementasi saat ini menganggap array apa pun dengan kunci bernomor urut, mulai dari 0 array normal. Dan array normal tidak mengandung kunci . Dan inilah masalahnya. Dalam situasi driver melihat array normal, tidak ada informasi nama bidang di BSON yang dikirim ke server, dan karenanya server tidak dapat memperbarui bidang.
Saya tidak dapat memikirkan cara untuk mengubah perilaku ini tanpa melanggar kode apa pun yang ada. Jadi jika Anda menginginkan nama bidang numerik, Anda harus menggunakan objek stdClass untuk "dokumen utama". Atau, Anda dapat memasukkan kunci tersebut ke dalam dokumen yang disematkan dan kemudian memperbarui:
<?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); ?>