避免mongoid循环处理太久时间

问题现象

使用mongoid的过程中发现一个问题,一个很简单的数据库查询,然后进行循环处理,循环始终跑不到最后,会抛出Moped::Errors::CursorNotFound异常。

1
2
3
  User.where(...).each do |user|
    # do something long time
  end

问题原因

官方说是查询时间太久了,导致cursor被服务器kill掉了

解决方法

第一种方法

将查询出来的结果放到临时变量再循环

1
2
3
4
  users = User.where(...)
  users.each do |user|
    # do something long time
  end

第二种方法

no_timeout方法再循环

1
2
3
  User.where(...).no_timeout.each do |user|
    # do something long time
  end

评论