是否可以指定查询在Mongoid中应使用的索引?

时间:2010-12-29 22:13:18

标签: ruby mongodb mongoid

当一个索引是另一个索引的子集时,MongoDB似乎使用了低效的查询模式。

class Model
  field :status, :type => Integer
  field :title, :type => String
  field :subtitle, :type => String
  field :rating, :type => Float

  index([
    [:status, Mongo::ASCENDING],
    [:title, Mongo::ASCENDING],
    [:subtitle, Mongo::ASCENDING],
    [:rating, Mongo::DESCENDING]
  ])
  index([
    [:status, Mongo::ASCENDING],
    [:title, Mongo::ASCENDING],
    [:rating, Mongo::DESCENDING]
  ])
end

第一个索引在查询statustitlesubtitle以及排序rating时以及仅查询status和{时{1}}并在title上排序,即使在javascript控制台中使用ratingexplain()也说明使用第二个索引的速度要快4倍。

如何告诉Mongoid告诉MongoDB使用第二个索引?

2 个答案:

答案 0 :(得分:7)

您可以使用Mongo::Collection

将提示等选项传递给Mongoid::Criterion::Optional.extras

一个例子:

criteria = Model.where(:status => true, :title => 'hello world').desc(:rating)
criteria.extras(:hint => {:status => 1, :title => 1, :rating => -1})

extras接受Mongo::Collection可以处理的任何内容

答案 1 :(得分:0)

http://www.mongodb.org/display/DOCS/Optimization#Optimization-Hint

  

虽然经常使用mongo查询优化器   表现得非常好,明确的“提示”   可以用来强迫mongo使用a   指定的指数,有可能改善   在某些情况下的表现。

db.collection.find({user:u, foo:d}).hint({user:1});

你需要在http://www.rdoc.info/github/mongoid/mongoid/master/Mongoid/Cursor工作,因为我对Ruby不够了解。它提到了暗示。