1

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

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

每个文档都是一个对象;对象具有对象、对象数组等属性。Mongo 将它的 _id 对象插入到我的文档中,我完全没问题。

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

防止这种不需要的类型转换行为似乎应该是微不足道的,但是如何呢? 我找不到任何关于如何做的参考。

此外,从第 7 级深度开始的数据(恰好是 [document object].[array].[object].[object].[object].[array]. [object])被省略了。

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

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

4

1 回答 1

-1

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

这是因为 PHP 数组既可以是关联数组,也可以是数字数组,因此在插入关联数组之后..您不会想要返回 stdclass 对象。

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

在 PHP 中,使用 stdclass 对象并不是特别常见,而且我几乎从未见过数组的 stdclass 对象或其他方式——使用起来也非常麻烦(还记得SimpleXML吗?)。

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

于 2013-10-18T00:46:31.600 回答