-
Type:
Task
-
Resolution: Done
-
Affects Version/s: None
-
Component/s: None
-
None
-
None
-
None
-
None
-
None
-
None
-
None
-
None
In the output logged by Mongoid::Tasks.remove_indexes, it includes all indexes defined on the collection.
indexes = model.collection.indexes.map{ |doc| doc["name"] }
indexes.delete_one("_id_")
model.remove_indexes
logger.info("MONGOID: Removing indexes on: #{model} for: #{indexes.join(', ')}.")
However, internally, model.remove_index only removes indexes if there is an index specification defined on the model:
def remove_indexes
indexed_database_names.each do |database|
collection = with(read: { mode: :primary }, database: database).collection
begin
collection.indexes.each do |spec|
unless spec["name"] == "_id_"
collection.indexes.drop_one(spec["key"])
end
end
rescue Mongo::Error::OperationFailure; end
end and true
end
def indexed_database_names
index_specifications.map do |spec|
spec.options[:database] || database_name
end.uniq
end
This means that removing all of the indexes from a model class will cause it to be excluded when indexes are removed.
It isn't clear to me whether remove_indexes is meant to also remove_undefined_indexes implicitly. The log output and the docs at http://mongoid.org/en/mongoid/docs/indexing.html seem to imply that it will. It would make sense to me that it should always remove indexes from the primary database.
cc: @sentience