我正在使用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));
这是'插入'操作的预期行为吗?
答案 0 :(得分:1)
如您所述stdclass
确实有效,驱动程序确实在对象上设置了_id
字段。这是因为stdclass
类似于关联数组,它的属性可以像一个一样公开设置。
SimpleXMLElement
实际上并不是一个对象,如评论中所述:
使SimpleXMLElement工作的难点在于它感觉和行为就像一个对象,但实际上是一个系统RESOURCE(特别是一个libxml资源)。
http://php.net/manual/en/class.simplexmlelement.php
继续评论:
这就是为什么你不能将SimpleXMLElement存储到$ _SESSION或对节点值执行直接比较操作而不首先将它们转换为某种类型的对象。 $ _SESSION期望存储“对象”,比较运算符期望比较2个“对象”,而SimpleXMLElements不是对象。
因此,考虑到这一点,我相信你需要在资源工作之前强制转换SimpleXMLElement
对象。但是,即使这样,如果对象不是stdclass
或者很容易序列化的话,驱动程序也很难理解如何插入对象。
答案 1 :(得分:0)
您可以在PHP代码中为_id字段生成自己的MongoID。当你创建一个新的MongoID对象时,它使用数据库用于生成ID的相同算法,因此它不比让mongodb生成它更好或更差(唯一的区别:字节4-6是机器标识符)运行PHP堆栈的机器,而不是运行数据库的机器)。但是当您在PHP代码中生成_id时,您的优势在于它在PHP中是已知的,而无需在数据库中查询它生成的值。