私はこれがなぜ起こるのかについていくつかの調査を行ってきました。そして、私はこの問題を「修正」する方法を見つけることができないと思います。
JavaScriptには、配列と連想配列/オブジェクトの違いがあります。 PHPには、配列とオブジェクトの違いがあります。 PHPの場合、連想配列は配列であり、JavaScriptの場合はオブジェクトです。
PHPドライバーが配列をJSONオブジェクトに変換する必要がある場合、配列が次のいずれかであるかどうかを判断しようとします。または連想配列。現在の実装では、0から始まる連続番号のキーを持つすべての配列が通常の配列と見なされます。また、通常の配列にはキーが含まれていません 。そしてこれが問題です。ドライバーが通常の配列を認識している状況では、サーバーに送信されるBSONにフィールド名情報がないため、サーバーはフィールドを更新できません。
既存のコードを壊さずにこの動作を変更する方法を考えることはできません。したがって、数値のフィールド名が必要な場合は、「メインドキュメント」にstdClassオブジェクトを使用する必要があります。または、これらのキーを埋め込みドキュメントにプッシュしてから更新することもできます。
<?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); ?>