【问题标题】:Improve performance of find_by method matching strings?提高 find_by 方法匹配字符串的性能?
【发布时间】:2018-01-09 18:08:47
【问题描述】:

请原谅我对 Ruby/Rails 的无知,我还在学习。

详情:
我有两个 mongodb 表。 people 有 214 条记录,people_org 有 107 条,以后只会增加。这些表之间唯一的唯一联系是人名,平均约 15 个字符。我目前无法控制此数据库结构。

目前我正在遍历每个people 对象,然后使用find_by 查找匹配记录,打印我需要的ID,并打印一些信息。

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

问题:
性能很慢(约 10 秒)。

可能的解决方案:
(1)我们的团队可能会适应不依赖字符串匹配的结构,而是使用整数(我认为这会提高性能)。

(2) 或许有更有效的方法?

(3) 也许有一种方法可以准备或更改数据以进行更有效的排序?

提前感谢您的帮助。

【问题讨论】:

  • people 和 people_org 之间有关联吗?
  • 可以使用MongoDB提供的lookup聚合:stackoverflow.com/a/35948843/2100645
  • 你在用mongoid吗?
  • 很慢? 10 秒太糟糕了,尤其是对于几百条记录。
  • (3) : 你可以在显示页面之前抓取所有的PeopleOrg记录并尝试在视图中查找它们:@people_orgs_grouped_by_name = PeopleOrg.where(name: @people.pluck(:name)).group_by(&amp;:name),然后在视图中使用if @people_orgs_grouped_by_name[p.name].present?等( 1) 是的,您应该在不使用名称的情况下定义两个模型之间的关系,因为 Bob (id 1) 与 Bob (id 2) 不同,但仍会被这段代码抓取

标签: ruby-on-rails ruby mongodb erb findby


【解决方案1】:

正如评论中提到的,您可以利用MongoDB Aggregation operator $lookup 对另一个集合执行查找操作。

例如,在people 集合中有 MongoDB 文档,如下所示:

{ "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+ 起可用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    • 2011-11-23
    • 2017-09-20
    • 1970-01-01
    相关资源
    最近更新 更多