繁体   English   中英

批量插入Mongo-红宝石

[英]Bulk Insert into Mongo - Ruby

我是Ruby和Mongo的新手,正在使用Twitter数据。 我正在使用Ruby 1.9.3和Mongo gem。

我正在从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

任何帮助是极大的赞赏。

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

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

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

你到底在做什么 为什么不使用纯红宝石或纯蒙哥(同样也是红宝石)? 以及为什么您真的需要加载每个属性?

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

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

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_atupdated_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确实可以进行延迟加载,因此,如果您不尝试使用属性,则不会加载该参数。 实际上,不使用每个属性都可以节省大量时间。 这些方法将更改现有文档,而不会创建另一个文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM