0

我是 Ruby 和 Mongo 的新手,正在处理 twitter 数据。我正在使用 Ruby 1.9.3 和 Mongo gems。

我正在从 Mongo 中查询批量数据,过滤掉一些文档,处理剩余的文档(插入新字段),然后将新文档写入 Mongo。

下面的代码正在运行,但运行速度相对较慢,因为我循环使用 .each 然后将新文档一次插入到 Mongo 中。

我的问题:如何构造成批量处理和插入?

cursor = raw.find({'user.screen_name' => users[cur], 'entities.urls' => []},{:fields => params})

cursor.each do |r| 
  if r['lang'] == "en"
    score = r['retweet_count'] + r['favorite_count']
    timestamp = Time.now.strftime("%d/%m/%Y %H:%M")

    #Commit to Mongo
    @document = {:id => r['id'],
                :id_str => r['id_str'],
                :retweet_count => r['retweet_count'],
                :favorite_count => r['favorite_count'],
                :score => score,    
                :created_at => r['created_at'],
                :timestamp => timestamp,
                :user => [{:id => r['user']['id'],
                           :id_str => r['user']['id_str'],
                           :screen_name => r['user']['screen_name'],
                          }
                         ]
                }
    @collection.save(@document)   
    end #end.if
end #end.each

任何帮助是极大的赞赏。

4

2 回答 2

0

在你的情况下,没有办法让它更快。您可以做的一件事是批量检索文档,处理它们并批量重新插入它们,但它仍然会很慢。

为了加快速度,您需要在数据已经存在的所有处理服务器端进行。

如果结果文档不超过 16mb,您应该使用mongodb 的聚合框架,或者为了获得更大的灵活性但执行速度较慢(比您的解决方案的潜力快得多),您可以使用mongodb 的 MapReduce 框架

于 2013-07-17T12:12:44.757 回答
0

你到底在做什么?为什么不去纯红宝石或纯蒙戈(那也是红宝石)?为什么你真的需要加载每一个属性?

我从您的代码中了解到的是您实际上创建了一个全新的文档,我认为这是错误的。

你可以在红宝石方面做到这一点:

cursor = YourModel.find(params)

cursor.each do |r|
    if r.lang == "en"
        r.score = r.retweet_count + r.favorite_count
        r.timestamp = Time.now.strftime("%d/%m/%Y %H:%M")
        r.save
    end #end.if
end #end.each

当然,您可以导入include Mongoid::Timestamps模型并处理您的created_at, 和updated_at属性(它自己创建它们)

在 mongoid 中,首先你得到你的集合有点困难,use my_db然后下一个代码将生成你想要的

db.models.find({something: your_param}).forEach(function(doc){
    doc.score = doc.retweet_count + doc.favorite_count
    doc.timestamp = new Timestamp()
    db.models.save(doc)
    }
);

我不知道你的参数是什么,但创建它们很容易,而且 mongoid 确实会延迟加载,所以如果你不尝试使用属性,它就不会加载它。您实际上可以节省大量时间,而不是使用每个属性。而这些方法,改变现有的文件,并不会创建另一个。

于 2013-07-17T13:01:14.443 回答