快速过滤基于属性的Mongoid文档的最佳方法?

时间:2011-12-23 01:18:39

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

我是Rails和Mongoid的相对新手,如果这个问题的答案显而易见,请道歉。 :)

我正在构建一个Rails 3应用程序,允许用户根据电影的属性查找电影。我有一个MoviesController行为index,允许用户根据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>
...

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

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

在genere和studio上制作索引。

在mongo shell中:

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

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

基本上,在课堂上:

class Movie
    index :genre
    index :studio
end

答案 1 :(得分:0)

一行回复:为您的馆藏添加索引可能会加快速度。

长响应:您正在考虑向应用程序添加缓存,因为数据库感觉很慢,您可能知道如果您使用关系引擎那么那些东西就可以了。您应该开发您的应用程序,而不是担心如何缓存内容:)

您的应用程序中是否有任何内容阻止您使用传统的关系引擎?如果有,请继续使用指数,这可能会解决它。如果没有,为什么选择Mongo?