【问题标题】:Best way to filter Mongoid documents based on attributes quickly?基于属性快速过滤Mongodb文档的最佳方法?
【发布时间】:2011-12-23 01:18:39
【问题描述】:

我是 Rails 和 Mongoid 的新手,如果这个问题的答案很明显,我深表歉意。 :)

我正在构建一个 Rails 3 应用程序,它允许用户根据电影的属性来查找电影。我有一个带有index 操作的MoviesController,它允许用户根据Movie 模型中的属性(如genrestudio 等)进行排序。

我提出了以下解决方案,但这感觉不可持续,因为随着我的数据库的增长,它已经开始放缓。

# controllers/movies_controller.rb

def index
  if params[:genre]
    @movies = Movie.where(:genre => params[:genre])
  elsif params[:studio]
    @movies = Movie.where(:studio => params[:studio])
  else
    @movies = Movie.all
  end
end

# views/movies/index.html.erb

<li><%= link_to "Action", movies_path(:genre => "Action") %></li>
<li><%= link_to "Suspense", movies_path(:genre => "Suspense") %></li>
<li><%= link_to "Drama", movies_path(:genre => "Drama") %></li>
...

<li><%= link_to "Paramount", movies_path(:studio => "Paramount") %></li>
<li><%= link_to "Universal", movies_path(:studio => "Universal") %></li>
<li><%= link_to "Disney", movies_path(:studio => "Disney") %></li>
...

我已经探索了动作和片段缓存以加快速度,但我必须认为有更好的方法来做到这一点。

提前感谢您的帮助!

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 mongodb mongoid


    【解决方案1】:

    对genere和studio进行索引。

    在 mongo 外壳中:

    db.movies.ensureIndex({genre: 1})
    db.movies.ensureIndex({studio: 1})
    

    如果您想在 mongoid 中执行此操作,则有一些关于 here 的信息。

    基本上,在班级内:

    class Movie
        index :genre
        index :studio
    end
    

    【讨论】:

      【解决方案2】:

      单行响应:向您的集合添加索引可能会加快速度。

      长响应:您正在考虑向应用程序添加缓存,因为 DB 感觉很慢,并且您可能知道如果您使用的是关系引擎,那么这些东西会很好。你应该开发你的应用程序,而不是担心如何缓存东西:)

      您的应用程序中是否有任何东西阻止您使用传统的关系引擎?如果有,请继续,使用索引,也许这会解决它。如果没有,为什么要选择 Mongo?

      【讨论】:

      • 感谢 Federico,我会看看我的索引策略,看看是否能加快速度。我最初选择了 MongoDB,因此我不必担心迁移,因为我还在我的应用程序中为电视节目建模,我发现在我的“节目”文档中嵌入“剧集”对象更有效。跨度>
      猜你喜欢
      • 2017-11-30
      • 2021-12-28
      • 2020-01-03
      • 2021-09-24
      • 1970-01-01
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多