使用PHP从MongoDB获取文档作为对象?

时间:2013-09-12 00:39:18

标签: php mongodb

我是Mongo的新手,大约一周前首次使用它。过去几个月我一直在开发一个生成复杂JSON对象的应用程序。最初的意图是将它们存储在Mongo中,现在是实施CRUD的时候了。

在开发过程中,我将我的应用程序设置为从控制器中的静态数组中读取JSON(CodeIgniter 2.1)。这工作得很好;我使用Mongo shell导入它们,一切都是正确的结构。

每个文件都是一个对象;该对象具有对象,对象数组等属性。我把Mongo在我的文档中插入_id对象完全没问题。

但PHP拒绝我的文档作为对象返回;它给了我数组。事实上,文档中的每个对象都在每个深度都以数组形式返回。

似乎要防止这种不受欢迎的类型转换行为应该是微不足道的,但是如何?我找不到任何有关如何操作的参考。

此外,数据从第7级深度开始(恰好是[文档对象]。[数组]。[对象]。[对象]。[对象]。[数组]。 [对象] < / strong>)被忽略了。

最初我们认为这发生在CodeIgniter,ActiveRecord或cimongo库的某个地方,但是今天我通过直接使用MongoDB扩展来获得了相同的错误文档结构。

Web服务器正在运行Debian squeeze,PHP 5.3.3-7 + squeeze15,MongoDB PHP扩展版本1.2.12。当我登录时,Mongo运行的主机告诉我“MongoDB shell版本:2.4.5”。

1 个答案:

答案 0 :(得分:-1)

PHP驱动程序将始终将MongoDB文档作为数组返回。

这是因为PHP数组既可以是关联的也可以是数字的,所以在插入关联数组之后......你不会想要找回一个stdclass对象。

我们根本无法区分关联数组和stdclass对象,因为JSON(和BSON就此而言)没有关联数组类型。

在PHP中,使用stdclass对象并不是特别常见,我几乎没见过数组的stdclass对象,反之亦然 - 使用它也非常麻烦(记得SimpleXML?)

当您保存复杂的结构(例如应用程序模型)时,像Doctrine这样的ODM(对象文档映射器)系统将为文档添加一个附加键作为有关其结构的元数据。然后在检索文档时,他们会查找此字段名,以了解如何将数据转换回原始数据(例如,您的原始模型结构)。