索引
该驱动程序支持通过 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 | 此特定索引的storage engine的名称。 |
:version | 要使用的索引格式版本。 |
:default_language | 文本索引的默认语言。 |
:language_override | 覆盖默认语言时要使用的字段名称。 |
:text_version | 文本索引存储的版本格式。 |
:weights | 在文本搜索中指定字段和权重的文档。 |
:sphere_version | 2d 球体索引版本。 |
:bits | 设置 2d 索引中纬度和经度的最大边界。 |
:max | 2d 索引中纬度和经度的最大边界。 |
:min | 2d 索引中纬度和经度的最小边界。 |
:bucket_size | 对地理干草堆索引中的位置值进行分组的单位数。 |
:partial_filter_expression | 部分索引的筛选器。 |
:hidden | 一个布尔值,指定是否应隐藏索引;隐藏索引是指集合中存在但查询规划器不会使用的索引。 |
:commit_quorum 选项
在 MongoDB Server 版本 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
作为最终元素的哈希添加到传递给indexes#create_many
的索引数组中。 请注意,此哈希必须是数组中的最后一个元素。
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 的一个版本而异。