2012-04-18 42 views
0

我有一个包含大量内它的一个字段的数据,例如achievements以下文档中蒙戈文件:PHP Mongo光标覆盖文档中数据的子集?

{'id':12345,'name':'eric','achievements':['...','...','...']} 

有什么办法,我可以通过自己在PHP返回achievements场用光标,而不是将整个字段加载到内存中?当这个字段非常大(超过一百万个项目)时,它使用内存的很多

我试过->find(['id'=>new MongoId('12345')],['achievements'])语法,但是,整个achievements字段作为数组加载到内存中。理想情况下,我想要一个光标一次加载一个成就。这甚至有可能吗?似乎是一个很酷的功能,有...

干杯

回答

0

不,MongoDB的默认情况下将返回完整的文件。正如您所建议的,您可以使用字段选择来限制返回的字段,对于数组,您可以使用$slice运算符仅检索数组的子集。但是,当这样做时,获取阵列的“下一个”切片需要新的查询和全网络往返。

两个其他注意事项:

  1. 在MongoDB中2.1(以及未来的2.2稳定版),你可以使用$unwind运营商在Aggregation Framework效仿这种行为;但是,请注意,在2.2中,聚合​​框架将始终将结果作为具有嵌套数组的单个文档返回,因此这仍然无法帮助您避免内存问题。

  2. 我会强烈考虑在这里更改您的数据模型。正如你所看到的,“数百万个元素”的数组将导致大文档(MongoDB对文档大小有16MB的上限),并增加了应用程序代码的开销。有关如何对此进行建模的一些替代想法,请查看Schema Design at Scale,其中涵盖了与您在此处描述的内容非常相似的数据模型用例。