2017-08-02 6 views
1

私のRuby/Railsの無知を許して、私はまだ学んでいます。find_byメソッド一致文字列のパフォーマンスを向上させますか?

詳細:
私は2つのモンゴブテーブルを持っています。 peopleには214のレコードがあり、people_orgには107が含まれていますが、これは今後増加します。これらのテーブル間の唯一の一意の接続は、人の名前で、平均で15文字までです。私はこの時点でこのDB構造を支配していません。

現在、私は各peopleオブジェクトをループしていて、find_byを使用して一致するレコードを見つけ、必要なIDを印刷して情報を印刷します。

<%@people.each do |p|%> 
... 
    <%[email protected]_org.find_by(name: p.name).id%> 
    ...[priting a few paragraphs of text]... 
    <%end%> 
... 
<%end%> 

問題:
パフォーマンスが非常に遅い(〜10秒)。

潜在的なソリューション:
(1)私たちのチームは、文字列マッチングに依存しており、(私はこれがパフォーマンスを向上させるだろうと仮定)の代わりに整数を使用しない構造に適合させることができます。

(2)おそらくもっと効率的な方法がありますか?

(3)おそらく、より効果的な並べ替えのためにデータを準備または変更する方法がありますか?

ご協力いただきありがとうございます。

+0

あなたは 'people'と' people_org'間のいずれかのassocitionを持っていますか? – Vishal

+0

MongoDBが提供するルックアップ集約を使用することができます。https://stackoverflow.com/a/35948843/2100645 –

+0

mongoidを使用していますか? – Anthony

答えて

0

コメントに記載されているとおり、MongoDB Aggregation operator $lookupを利用して、別のコレクションへの参照操作を実行できます。例えば

、例えば以下にpeopleコレクション内のMongoDBのドキュメントた:あなたがルックアップするために、以下のようMongoDB Ruby Aggregationの例を使用することができます

{ "organisation": "NBCC", 
    "contact": "Brandon"} 

:以下のようにも

{ "name": "Brandon", 
    "phone": 123456789 } 

people_orgコレクション内のドキュメントの例をpeopleによるpeople_org

cursor = collection.aggregate([ 
        {"$match": 
          {"name":"Brandon"}}, 
        {"$lookup": 
          {"from": "people_org", 
          "localField": "name", 
          "foreignField": "contact", 
          "as": "organisation"} 
        }]) 
cursor.each do |document| 
    puts document 
end 

$lookupのみのMongoDB V3.2以降で使用可能です。なお+

関連する問題