【问题标题】:How to write empty associative array ({}) to MongoDB from PHP如何从 PHP 将空关联数组 ({}) 写入 MongoDB
【发布时间】:2013-02-04 13:46:23
【问题描述】:

当我尝试从 PHP 向 MongoDB 插入空 associative 数组 (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" : { } }

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

【问题讨论】:

    标签: php mongodb associative-array


    【解决方案1】:

    无论你存储的是空对象还是数组,有什么区别?在 BSON 中,arrays and objects are stored the same way, as a dict。无论如何,你的问题。

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

    如果你真的想存储一个空对象,试试:

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

    【讨论】:

    • 非常感谢,完美运行!我知道必须有一个简单的方法。 :) 顺便说一句,我猜第一行的问题是修辞? ;)
    • 我很高兴能帮上忙!但是,不,这个问题不是反问的。我可以理解您是否要默认使用空数组。这样你就可以稍后 $push/$addToSet/$pull/etc。但是为什么你需要它默认成为一个对象呢?无论如何,您都需要使用 $set ,如果值是一个对象,这会将数组更改为一个对象。可能与您的驱动程序/ORM 有关?
    • 主要原因是 dicts ({}) 是我的数据类型的自然选择...我有具有某些值的唯一键。使用列表 ([]) 我将不得不手动强制执行键的唯一性。在这种情况下,PHP 只是准备结构(即:插入文档),稍后从 Python 后端更新数据。希望这是有道理的...... :)
    • “dicts ({}) 是我的数据类型的自然选择”。这就是我的设计决定!赞成在文档中定义模式的预期用途。
    【解决方案2】:

    实际上有区别,如果为空,它将被视为非关联 [],然后不允许设置关联键,抛出异常:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-17
      • 1970-01-01
      • 2012-11-10
      相关资源
      最近更新 更多