Когда я пытаюсь вставить пустые ассоциативные массивы ( 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);