[英]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的聚合框架,或者为了获得更大的灵活性但执行速度较慢(比解决方案的潜力要快得多),可以使用mongodb的MapReduce框架
你到底在做什么 为什么不使用纯红宝石或纯蒙哥(同样也是红宝石)? 以及为什么您真的需要加载每个属性?
我从您的代码中了解到,您实际上是在创建一个全新的文档,我认为这是错误的。
您可以在红宝石方面做到这一点:
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确实可以进行延迟加载,因此,如果您不尝试使用属性,则不会加载该参数。 实际上,不使用每个属性都可以节省大量时间。 这些方法将更改现有文档,而不会创建另一个文档。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.