2017-08-02 75 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 +