0

我正在使用 MongoDB(2.4.1 版)来存储 XML 文件中的信息。在 XML 解析过程中,我为每个项目描述创建 SimpleXMLElement。这是插入新文档的代码:

$response = $collection->insert($object, array('safe'=>true, 'fsync'=> true)),

其中 $object 具有 SimpleXMLElement 类型。

问题是我需要获取插入文档的 id,但是当我在插入操作后尝试获取它时,它返回 NULL:

$response = $collection->insert($object, array('safe'=>true, 'fsync'=> true)),
die(var_dump($object));

这是“插入”操作的预期行为吗?

4

2 回答 2

1

如您所述stdclass,确实有效,并且驱动程序确实成功地_id在对象上设置了该字段。这是因为stdclass它类似于关联数组,并且它的属性可以像一个一样公开设置。

SimpleXMLElement如评论中所述,实际上并不是一个对象:

使 SimpleXMLElement 难以使用的原因在于它的感觉和行为就像一个对象,但实际上是一个系统资源(特别是 libxml 资源)。

http://php.net/manual/en/class.simplexmlelement.php

进一步在评论中:

这就是为什么您不能将 SimpleXMLElement 存储到 $_SESSION 或对节点值执行直接比较操作而不先将它们转换为某种类型的对象。$_SESSION 期望存储“一个对象”,比较运算符期望比较 2 个“对象”,而 SimpleXMLElements 不是对象。

因此,考虑到这一点,我相信您需要SimpleXMLElement先从资源中转换为对象,然后它才能工作。stdclass然而,即便如此,如果对象不是 a或易于序列化的对象,驱动程序也很难理解如何准确插入该对象。

于 2013-06-03T09:50:03.390 回答
0

您可以为 PHP 代码中的 _id 字段生成自己的MongoID。当您创建一个新的 MongoID 对象时,它使用与数据库生成 ID 相同的算法,因此它并不比让 mongodb 生成它更好或更差(唯一的区别:字节 4-6 是机器标识符运行 PHP 堆栈的机器,而不是运行数据库的机器)。但是当您在 PHP 代码中生成 _id 时,您的优势在于它在 PHP 中是已知的,而无需查询数据库以获取它生成的值。

于 2013-06-03T09:19:33.480 回答