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”字段的定义
换句话说...如何获取那些尚未创建的索引?
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