0

我有一个 Mongo 文档,其中一个字段包含大量数据,例如achievements在以下文档中:

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

有什么办法可以用 cursorachievements自己返回 PHP 中的字段,而不是将整个字段加载到内存中?当此字段非常大(超过一百万个项目)时,它会使用大量内存。

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

干杯

4

1 回答 1

0

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

另外两个注意事项:

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

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

于 2012-04-18T15:44:23.020 回答