2017-08-02 72 views
1

請原諒我的Ruby/Rails無知,我還在學習。提高find_by方法匹配字符串的性能?

詳情:
我有兩個mongodb表。 people有214條記錄,people_org有107條,這隻會在未來增加。這些表格之間唯一的唯一聯繫是一個人的姓名,平均約15個字符。我目前無法控制此數據庫結構。

當前我循環瀏覽每個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_org」之間是否有關聯? – Vishal

+0

您可以使用MongoDB提供的查找聚合:https://stackoverflow.com/a/35948843/2100645 –

+0

您使用的是mongoid嗎? – Anthony

回答

0

正如在評論中提到的那樣,您可以利用MongoDB Aggregation operator $lookup對另一個集合執行查找操作。

例如,具有MongoDB中的文檔people收集這樣的下面:

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

也是在people_org收集如下文件爲例:

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

您可以使用如下MongoDB Ruby Aggregation例如查找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 +