4

当我尝试从 PHP 向 MongoDB 插入空关联数组 ( hashmap/ dictionary/ dict/ {}) 时,它总是作为非关联空数组 ( 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" : { } }

第三种方式做我想要的,但有点尴尬,需要两个查询。有更好的解决方案吗?

4

2 回答 2

8

不管你存储的是空对象还是数组,有什么区别呢?在 BSON 中,数组和对象的存储方式与 dict 相同。无论如何,对于你的问题。

对于 PHP MongoDB 驱动程序,一个空数组就是这样,一个空数组,所以它将它存储为一个数组。当您向数组添加键/值对时,驱动程序就是这样理解它应该存储一个对象的。

如果您真的想存储一个空对象,请尝试:

$d = new \stdClass();
$collection->insert(array('z' => $d));
于 2013-02-04T14:48:31.823 回答
4

实际上有一个区别,如果为空,它将被视为非关联 [] 并且不允许设置关联键,从而引发异常:

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

于 2014-09-20T10:27:55.797 回答