ruby-on-rails - 批量查找 mongoDB 记录(使用 mongoid ruby​​

使用带有 mongoid 适配器的 rails 3 和 mongoDB,我如何批量查找到 mongo DB?我需要获取特定 mongo DB 集合中的所有记录并在 solr(用于搜索的数据的初始索引)中对其进行索引。

我遇到的问题是 Model.all 会抓取所有记录并将它们存储到内存中。然后,当我处理它们并在 solr 中建立索引时,我的内存被吃光了,进程终止了。

我要做的是在 mongo 中批量查找,这样我就可以一次迭代 1000 多条记录,将它们传递给 solr 以进行索引,然后处理接下来的 1000 条,等等......

我目前拥有的代码是这样做的:

Model.all.each do |r|
  Sunspot.index(r)
end

对于包含大约 150 万条记录的集合,这会占用 8+ GB 的内存并终止进程。在 ActiveRecord 中,有一个 find_in_batches 方法允许我将查询分 block 成可管理的批处理,以防止内存失控。但是,对于 mongoDB/mongoid,我似乎找不到类似的东西。

我希望能够做这样的事情:

Model.all.in_batches_of(1000) do |batch|
  Sunpot.index(batch)
end

这将通过每次只做一个可管理的问题集来缓解我的内存问题和查询困难。但是,关于在 mongoDB 中进行批量查找的文档很少。我看到很多关于批量插入但没有批量查找的文档。

最佳答案

使用 Mongoid,您无需手动批量查询。

在 Mongoid 中,Model.all 返回一个 Mongoid::Criteria 实例。在此 Criteria 上调用 #each 时,Mongo 驱动程序游标被实例化并用于迭代记录。这个底层的 Mongo 驱动游标已经批处理了所有记录。默认情况下,batch_size 为 100。

有关此主题的更多信息,请阅读 this comment from the Mongoid author and maintainer .

总而言之,您可以这样做:

Model.all.each do |r|
  Sunspot.index(r)
end

关于ruby-on-rails - 批量查找 mongoDB 记录(使用 mongoid ruby​​ 适配器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7041224/

相关文章:

node.js - Mongoose 试图打开未关闭的连接

mongodb - 如何使用 Scala 将 1 亿条记录加载到 MongoDB 中进行性能测试?

node.js - Node.js/Mongoose 上的 "VersionError: No ma

ruby-on-rails - mongoid 中 embeds_many 和 has_many 的

node.js - 如何使用 Mongoose findOne

mongodb - 如何使用多个 ip 地址设置 mongod.conf bind_ip

mongodb - 如何启动 mongodb shell?

mongodb - 在 MongoDB 中使用 UUID 而不是 ObjectID

mongodb - 在 node.js 和 mongodb 中创建注册和登录表单

json - 从数据库存储和查询 JSON