Как написать пустой ассоциативный массив ({}) в MongoDB из PHP

Когда я пытаюсь вставить пустые ассоциативные массивы ( hashmap / dictionary / dict / {} ) в MongoDB из PHP, он всегда вставляется как неассоциативный пустой массив ( list / [] ). Могу ли я заставить ассоциативный массив?

Пример:

 $m = new Mongo('mongodb://localhost:27017'); $db = $m->selectDB('test'); $collection = $db->selectCollection('test'); // 1: inserts [] $d = array( 'x' => array() ); $collection->insert($d); // 2: inserts [] $d = array( 'y' => array('a'=>'123') ); unset($d['y']['a']); $collection->insert($d); // 3: inserts {} $d = array( 'z' => array('a'=>'123') ); $collection->insert($d); $collection->update(array('_id' => $d['_id']), array('$unset' => array('z.a'=>true))); с $m = new Mongo('mongodb://localhost:27017'); $db = $m->selectDB('test'); $collection = $db->selectCollection('test'); // 1: inserts [] $d = array( 'x' => array() ); $collection->insert($d); // 2: inserts [] $d = array( 'y' => array('a'=>'123') ); unset($d['y']['a']); $collection->insert($d); // 3: inserts {} $d = array( 'z' => array('a'=>'123') ); $collection->insert($d); $collection->update(array('_id' => $d['_id']), array('$unset' => array('z.a'=>true))); 

И результаты:

 > db.test.find().pretty() { "_id" : ObjectId("510fb9ede695c5381a000000"), "x" : [ ] } { "_id" : ObjectId("510fb9ede695c5381a000001"), "y" : [ ] } { "_id" : ObjectId("510fb9ede695c5381a000002"), "z" : { } } 

Третий способ делает то, что я хочу, но он немного неудобен и требует двух запросов. Есть ли лучшее решение?

Если вы храните пустой объект или массив, какая разница? В BSON массивы и объекты сохраняются одинаково, как dict . В любом случае, на ваш вопрос.

Для драйвера PHP MongoDB пустой массив – это просто пустой массив, поэтому он хранит его как массив. Когда вы добавляете пару ключей / значений в массив, то, как понимает драйвер, он должен хранить объект.

Если вы действительно хотите сохранить пустой объект, попробуйте:

 $d = new \stdClass(); $collection->insert(array('z' => $d)); 

Фактически существует разница в том, что он будет считаться неассоциативным [], если он пуст, и затем не позволит установить ассоциативный ключ, выбрасывая исключение:

 MongoCursorException: can't append to array using string field name 

Вы должны использовать как объект как таковой:

 $d = array( 'x' => (object) array() ); $collection->insert($d); 

https://jira.mongodb.org/browse/PHP-172