0

Ruby と Mongo は初めてで、Twitter データを扱っています。Ruby 1.9.3 と Mongo gem を使用しています。

Mongo から大量のデータをクエリし、いくつかのドキュメントを除外し、残りのドキュメントを処理 (新しいフィールドを挿入) してから、新しいドキュメントを Mongo に書き込みます。

以下のコードは機能していますが、.each を使用してループし、新しいドキュメントを一度に 1 つずつ 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

正確には何をしているのですか?純粋なルビーまたは純粋なモンゴに行かないのはなぜですか(それもルビーです)?また、すべての属性をロードする必要があるのはなぜですか?

あなたのコードから私が理解したのは、実際にはまったく新しいドキュメントを作成しているということですが、それは間違っていると思います。

Ruby側でこれを行うことができます:

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属性を処理します(それ自体を作成します)

use my_dbmongoid では、最初にコレクションを取得してから、次のコードで必要なものを生成するのが少し難しくなります。

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)
    }
);

あなたのパラメータが何であったかはわかりませんが、それらを作成するのは簡単ですし、モンゴイドは本当に遅延読み込みを行うので、属性を使用しようとしないと、それは読み込まれません. すべての属性を使用しなくても、実際には多くの時間を節約できます。これらのメソッドは、既存のドキュメントを変更し、別のドキュメントを作成しません。

于 2013-07-17T13:01:14.443 に答える