如何为模型获取新的 mongoid 索引

tuf*_*fla 2 ruby mongodb mongoid

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

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

  index({ email: 1 }, { unique: true })
  index({ ssn: 1 }, { unique: true })
end
Run Code Online (Sandbox Code Playgroud)

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

Person.collection.indexes.each {|i| puts i.inspect}
Run Code Online (Sandbox Code Playgroud)

我收到以下回复:

{"v"=>1, "key"=>{"_id"=>1}, "name"=>"_id_", "ns"=>"x.person"}
{"v"=>1, "unique"=>true, "key"=>{"email"=>1}, "name"=>"email_1", "ns"=>"x.person"}
Run Code Online (Sandbox Code Playgroud)

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

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

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

liu*_*kgg 5

Person.index_specifications 
Run Code Online (Sandbox Code Playgroud)

显示模型中定义的索引,而不管它是否存在于数据库中。

和

Person.collection.indexes
Run Code Online (Sandbox Code Playgroud)

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

所以还有一点值得关注:

rake db:mongoid:create_indexes 
Run Code Online (Sandbox Code Playgroud)

将在数据库中的模型中创建定义的索引,它实际上使用了“index_specifications”方法。

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

rake db:mongoid:remove_indexes 
Run Code Online (Sandbox Code Playgroud)

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

rake db:mongoid:remove_undefined_indexes
Run Code Online (Sandbox Code Playgroud)

实际上使用了“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