假设我已经使用几个索引定义了我的模型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”
的定义换句话说......如何获取那些尚未创建的索引?
答案 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