索引
驱动器提供了通过索引属性在集合上创建、删除和查看indexes
client = Mongo::Client.new([ '127.0.0.1:27017' ], database: 'music') client[:bands].indexes # => #<Mongo::Index::View:0x000055e2822b9318 @collection=#<Mongo::Collection:0x660 namespace=music.bands>, @batch_size=nil, @options={}>
创建索引
索引可以逐个创建,也可以在单个操作中创建多个。在 MongoDB 3.0 及更高版本中创建多个索引时,索引并行创建;在早期版本中按顺序创建。
要创建单个索引,请使用 indexes#create_one
,将键规范作为第一个参数,将选项作为第二个参数传递
client[:bands].indexes.create_one(genre: 1) client[:bands].indexes.create_one( { name: 1 }, unique: true, expire_after: 120, )
要创建多个索引,请使用indexes#create_many
,它接受一个索引规范的数组。与create_one
不同,每个索引规范都是一个哈希表,其中key
键映射到键规范,而选项则在顶级指定。
client[:bands].indexes.create_many([ { key: { genre: 1 } }, { key: { name: 1 }, unique: true, expire_after: 120 }, ])
以下是在创建索引时可以添加的所有选项的完整列表。这些选项反映了由createIndex命令支持的选择。
选项 | 描述 |
---|---|
:background | 可以是 true 或false 。指示索引在后台创建。 |
:expire_after | 文档在集合中过期的秒数。 |
:name | 索引的名称。 |
:sparse | 指示索引是否应该是稀疏的,可以是 true 或false 。 |
:storage_engine | 此特定索引的存储引擎名称。 |
:version | 要使用的索引格式版本。 |
:default_language | 文本索引的默认语言。 |
:language_override | 用于覆盖默认语言的字段名称。 |
:text_version | 文本索引存储的版本格式。 |
:weights | 指定文本搜索中的字段和权重。 |
:sphere_version | 2d球面索引版本。 |
:bits | 设置2d索引中纬度和经度的最大边界。 |
:max | 2d索引中纬度和经度的最大边界。 |
:min | 2d索引中纬度和经度的最小边界。 |
:bucket_size | 在地理haystack索引中按位置值分组时的单元数量。 |
:partial_filter_expression | 部分索引的过滤器。 |
:hidden | 一个布尔值,指定索引是否应该被隐藏;隐藏的索引是存在于集合中但不会被查询计划器使用的索引。 |
:commit_quorum选项
在MongoDB服务器版本4.4及更高版本中,可以在创建索引时指定:commit_quorum
选项。此选项与其他索引选项不同,因为它确定索引创建期间的服务器行为,而不是确定单个索引的行为。
:commit_quorum 选项指定在索引准备就绪之前,副本集中多少个投票、承载数据的成员必须完成索引构建。可能的值是整数(从0到副本集中投票、承载数据的成员数),"majority",或"votingMembers"。
在创建一个索引时指定 :commit_quorum,请将另一个选项添加到 indexes#create_one 方法的第二个参数。
client[:bands].indexes.create_one( { name: 1 }, unique: true, expire_after: 120, commit_quorum: 'majority' )
在创建多个索引时指定创建选项,请将一个包含 :commit_quorum 的 Hash 添加到传递给 indexes#create_many 的索引数组的末尾。注意,这个 Hash 必须是数组的最后一个元素。
client[:bands].indexes.create_many([ { key: { genre: 1 } }, { key: { name: 1 }, unique: true, expire_after: 120 }, { commit_quorum: 'majority' }, ])
删除索引
要删除索引,请调用 indexes#drop_one 或 indexes#drop_all。
# Drops the name_1 index. client[:bands].indexes.drop_one( 'name_1' ) # Drops all indexes in the collection. client[:bands].indexes.drop_all
列出索引
要列出索引,遍历 indexes 对象。
client[:bands].indexes.each do |index_spec| p index_spec # {"v"=>2, "key"=>{"_id"=>1}, "name"=>"_id_"} # {"v"=>2, "key"=>{"genre"=>1}, "name"=>"genre_1"} # {"v"=>2, "unique"=>true, "key"=>{"name"=>1}, "name"=>"name_1", # "expireAfterSeconds"=>120} end
每次迭代返回由 listIndexes 命令返回的索引规范。
注意
此方法返回的索引规范的结构和内容可能从 MongoDB 的一个版本到另一个版本发生变化。