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" : { } }

3番目の方法は私が望むことを行いますが、それは少し厄介で、2つのクエリが必要です。より良い解決策はありますか?

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 に答える