mongodb之(6)mongodb集合与索引

1、集合

1.1、创建集合

MongoDB 中使用 createCollection() 方法来创建集合。

语法格式:

db.createCollection(name, options)

参数说明:

  • name: 要创建的集合名称
  • options: 可选参数, 指定有关内存大小及索引的选项

options参数:

字段 类型 描述
capped Bool (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。
autoIndexId Bool (可选)如为 true,自动在 _id 字段创建索引。默认为 false。
size Number (可选)为固定集合指定一个最大值,以千字节计(KB)。如果 capped 为 true,也需要指定该字段。
max Number (可选)指定固定集合中包含文档的最大数量。

命令示例:

> use location switched to db location > db location > db.createCollection("city",{capped:true,autoIndexId:true,size:6142800,max:10}) { "note" : "the autoIndexId option is deprecated and will be removed in a future release", "ok" : 1 }

1.2、固定大小集合

当在创建索引时,若capped为true,size则为固定集合的最大字节数,max为固定集合的最大文档数。固定集合创建后,就不能改变了,如果要改变固定集合的属性,只能将它删除之后再重建。因此在创建固定集合之前应该仔细想清楚它的大小。固定集合同时指定了文档数量和集合大小的限制,不管先达到那个限制,之后插入的新文档就会把最老的文档挤出集合,即固定集合的文档数量不能超过文档数量限制,固定集合的大小也不能超过集合大小的限制。

固定集合的访问模式与其他集合不同,数据被顺序写入磁盘的固定空间。故他们在蝶式磁盘上写入速度非常快,尤其是集合拥有专用磁盘时。固定集合可用于记录日志,尽管他们不够灵活。虽然可以在创建时指定集合大小,但无法控制什么时候数据会被覆盖。

创建固定集合示例:创建大小限制为500G,文档数量限制为1000000000的文档。

> db.createCollection("city",{capped:true,size:524288000,max:1000000000})

2、索引

2.1、创建索引

创建索引的语法如下:

db.collection.createIndex(keys, options)

keys说明:

语法中 Key 值为你要创建的索引字段,1 为指定按升序创建索引,-1为按降序来创建索引。createIndex()方法中可以设置多个字段创建索引。

options选项说明:

Parameter Type Description
background Boolean 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 background" 默认值为false。
unique Boolean 建立的索引是否唯一。指定为true创建唯一索引。默认值为false.
name string 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。
dropDups Boolean 3.0+版本已废弃。在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false.
sparse Boolean 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.
expireAfterSeconds integer 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。
v index version 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。
weights document 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。
default_language string 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语
language_override string 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.

创建索引示例:

> db.city.createIndex({code:1,name:1},{background:true,unique:true,name:"uni_code_name",sparse:true}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 } > > > db.city.getIndexes() [ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "location.city" }, { "v" : 2, "unique" : true, "key" : { "code" : 1, "name" : 1 }, "name" : "uni_code_name", "ns" : "location.city", "background" : true, "sparse" : true } ]

查询集合索引相关命令:

  • 查看集合索引:db.collection.getIndexes()
  • 查看集合索引大小:db.collection.totalIndexSize()
  • 删除集合所有索引:db.collection.dropIndexes()
  • 删除集合指定索引:db.collection.dropIndex(indexName)

2.2、索引类型

创建索引时可以指定一些选项,使用不同选项建立的索引会有不同的行为。mongodb在创建索引时会阻塞所有对数据库的读写请求,直到索引创建完成。如果希望在创建索引的同时可以处理读写请求,可以在创建索引时指定background选项。这样在创建索引时,如果有新的数据库请求,创建索引的过程会暂停,但任然对应用程序的性能有较大影响。

2.2.1、唯一索引

唯一索引可以确保集合的每一个文档的指定键都是唯一的。

如果一个文档没有对应的键,索引会将其作为null存储,故如果某个键建立了唯一索引,但插入了多个缺少该索引键的文档,由于集合已经存在一个该索引键的值为null的文档而导致插入失败。

索引存储桶的大小时有限制的,如果某个索引条目超出了它的限制,那么这个条目就不会包含在索引中。这将导致通过索引查找文档时会丢失文档。所有字段都必须小于1024字节才能包含到索引中,如果一个文档的字段由于太大不能包含在索引里,mongodb不会返回任何错误或警告。

创建唯一索引示例:

> db.city.createIndex({code:1,name:1},{background:true,unique:true,name:"uni_code_name",sparse:true}) { "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }

2.2.2、稀疏索引

唯一索引会把null看做值,所以无法将多个缺少唯一索引中的键的文档插入到集合中。然而,在一些情况下,你可能希望唯一索引只对包含相应键的文档生效。如果有一个可能存在也有可能不存在的字段,当其存在时必须唯一,这是可将unique和sparse选择组合一起使用。稀疏索引不必是唯一的。只要去掉unique选项,就可以创建一个非唯一的稀疏索引。

2.2.3、TTL索引

TTL索引允许为每个文档设置一个超时时间,一个文档达到预设的过期时间后就会被删除,TTL索引对缓存问题非常有用。创建索引时指定expireAfterSecs就可创建一个TTL索引。

mongodb没分钟会对TTL索引进行一次清理,所以不应该以秒为单位的时间保证索引的存活状态。一个给定的集合上可以有多个TTL索引,但TTL索引不能是复合索引,但可以像普通索引一样用来优化排序和查询。

2.2.4、全文本索引

操作频繁的集合上创建全文本索引可能会导致mongodb过载,所以应该在离线状态下创建全文本索引,或是在对性能无要求时,创建全文索引会占用很多内存。全文本索引的集合的写入性能比较差,其也会降低分片时的数据迁移速度,因将数据迁移到其他分片时,所有文本需重建索引。

2.2.5、地理空间索引

mongodb支持2dsphere(球面类型地图)索引和2d索引(平面地图和时间连续)。2dsphere允许使用GeoJSON格式指定点、线和多边形。

创建地理空间索引示例:

db.city.ensureIndex({"loc":"2dsphere"}})

2.2.5.1、地理空间查询

mongodb的地理空间查询支持交集、包含、接近查询,需要将希望查找的内容指定为形如{“$geometry”:geoJSONDesc}的格式。

交集查询:

可以使用$geoIntersects操作符找出与查询位置相交的文档。


mongodb之(6)mongodb集合与索引_第1张图片
clipboard.png

包含查询:

可以使用$within查询完全包含在某个区域的文档。

9795603-96c79a03d1683c55.png
clipboard.png

接近查询:

使用$near查询附近的位置,$near是唯一一个会对查询结果进行自动排序的地理空间操作,其返回结果是按照距离由近及远排序的。


9795603-c97e63c5df176718.png
clipboard.png

你可能感兴趣的:(mongodb之(6)mongodb集合与索引)