Как записать пустой ассоциативный массив ({}) в 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)));


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



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


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

2 ответов:

Сохраняете ли вы пустой объект или массив, какая разница? В 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

Comments

    Ничего не найдено.