我使用相同的光标迭代对象几次,所以我假设将对象保存在内存中会更快。
在将所有对象与 一起使用之前,我尝试将所有对象放入一个数组中objects = cursor.to_a
,但是调用会在等待数据下载时阻止任何进一步的计算,最终速度会变慢。
我想到的另一种方法是在进行计算时将文档附加到数组中,然后使用数组进行进一步的计算。尽管这是非常不干净且难以维护的。
是否有任何代码已经这样做了?
所以在 Mongoid 中已经有一种方法可以做到这一点。它缓存每个查询和每个迭代,因此它实际上只在您查询数据时将数据保留在内存中,因此它不会阻塞。
它只是光标上的一个函数,你可以这样调用它:
Model.where(:name => "John").cache
尝试使用identity_map
,您可以在文档中找到更多详细信息:http: //mongoid.org/docs/installation/configuration.html
identity_map_enabled (false):当设置为 true 时,Mongoid 将从数据库加载的文档按其 id 存储在身份映射中,因此在同一工作单元中对同一文档的后续数据库查询不会命中数据库。这仅适用于目前的关系查询。有关更多信息,请参阅身份映射文档。
另一种选择:仅存储id
数组中的部分。Mongo::Cursor
据我所知,它本身不是哈希,而是类似于结果集的指针。更多信息:Mongo Docs