如何为模型

时间:2016-02-24 21:11:43

标签: ruby mongodb mongoid

假设我已经使用几个索引定义了我的模型Person:

class Person
  include Mongoid::Document
  field :email
  field :ssn

  index({ email: 1 }, { unique: true })
  index({ ssn: 1 }, { unique: true })
end

但是,只有电子邮件索引已存在于数据库中,因此当我调用

Person.collection.indexes.each {|i| puts i.inspect}

我收到以下回复:

{"v"=>1, "key"=>{"_id"=>1}, "name"=>"_id_", "ns"=>"x.person"}
{"v"=>1, "unique"=>true, "key"=>{"email"=>1}, "name"=>"email_1", "ns"=>"x.person"}

问题是,如何在模型中获取已定义索引的列表,即使它们尚未在mongo中创建?

就我而言,此类列表应包括字段“ssn”

的定义

换句话说......如何获取那些尚未创建的索引?

2 个答案:

答案 0 :(得分:4)

Person.index_specifications 

显示模型中定义的索引,无论它在数据库中是否存在。

并且

Person.collection.indexes

仅显示数据库中实际存在的索引。

所以还有其他值得关注的事情:

rake db:mongoid:create_indexes 

将创建数据库中模型中定义的索引,并在契约中使用方法“index_specifications”。

虽然这会删除除主键索引之外的所有索引:

rake db:mongoid:remove_indexes 

因此,当您只想删除数据库中存在但不再在数据库中定义的索引时,您应该使用:

rake db:mongoid:remove_undefined_indexes

在契约中使用'undefined_indexes'方法。

我希望这会有所帮助。

文档在这里:

https://mongoid.github.io/en/mongoid/docs/indexing.html

http://www.rubydoc.info/github/mongoid/mongoid/Mongoid/Tasks/Database#create_indexes-instance_method

答案 1 :(得分:0)

刚刚找到它......

我们可以将所有索引定义的列表放入模型中,如下所示:

Person.index_specifications

这是一个在加载应用程序时填充的数组,并且由“create_indexes”方法使用,如下所示:

https://github.com/mongodb/mongoid/blob/master/lib/mongoid/indexable.rb