代码之家  ›  专栏  ›  技术社区  ›  tommy chheng

如何使用mongoid/rails查询mongodb而不超时?

  •  5
  • tommy chheng  · 技术社区  · 14 年前

    另一系列:

    batch = [] 
    
    Record.where(:type => 'a').each do |r| 
      batch <<  make_score(r)
    
      if batch.size %100 == 0 
        Score.collection.insert(batch) 
        batch = [] 
      end 
    end 
    

    我一次要处理10万张唱片。不幸的是,20分钟后 Query response returned CURSOR_NOT_FOUND 错误。

    mongodb faq 说要用 skip limit 或者关闭超时,使用它们所有的事情大约慢2-3倍。

    如何与mongoid一起关闭超时?

    4 回复  |  直到 10 年前
        1
  •  9
  •   Jesse Wolgamott    14 年前

    这个 MongoDB docs 假设您可以传入一个timeout布尔值,并且它timeout为false,它将永远不会超时

    collection.find({"type" => "a"}, {:timeout=>false})
    

    Record.collection.find({:type=>'a'}, :timeout => false).each ...
    

    我也建议你看看蒙戈地图。似乎是tailer对这种集合数组操作所做的: http://www.mongodb.org/display/DOCS/MapReduce

        2
  •  7
  •   Quentin    11 年前

    在mongoid 3中,您可以使用:

    ModelName.all.no_timeout.each do |m|
       "do something with model"
    end
    

    很方便。

        3
  •  6
  •   Hakan Ensari    14 年前

    至少现在看来,您必须走很长的路,通过Mongo驱动程序查询:

    Mongoid.database[collection.name].find({ a_query }, { :timeout => false }) do |cursor| 
      cursor.each do |row| 
        do_stuff 
      end 
    end
    
        4
  •  1
  •   Bashar Abdullah    13 年前

    这是我做的变通方法。创建一个数组来保存完整的记录,并从这个数组开始工作,如下所示

    products = []
    
    Product.all.each do |p|
    products << p
    end
    
    products.each do |p|
    # Do your magic
    end
    

    将所有记录转储到数组中很可能在超时之前完成,除非您正在处理大量的记录。而且,如果您处理的记录太大或太多,这将消耗太多的内存,所以请记住。