每个文档默认都有一个字段_id
,这个字段会自动生成唯一索引,这个索引无法删除。这个字段的值可以是用户指定,如果不指定mongodb会自动生成。
生成的规则:
|<-- 4 -->|<- 3 ->|<-2->|<-- 3 -->|
+---------+-------+-----+---------+
|unix time| mid | pid | counter |
+---------+-------+-----+---------+
包含四个字段:
文档中的任何字段或者子文档的字段都可以当作索引,字段的值也可以是一个文档。
一个文档中的多个字段组成一个索引。最多支持31个字段。
当查询的条件是索引的前面几个字段时会使用复合索引。
比如:有索引{a:1,b:1,c:1}
,查询条件{a:"a",b:"b"}
就会使用这个索引,但是{b:"b"}
这样的查询条件就无法使用。
索引的顺序先按第一个字段排序,如果第一个字段相等,按照第二个字段排序,依次类推后面的字段顺序。因此,
{a:1,b:1}
,支持排序{a:-1,b:-1}/{a:1:b:1}
,不支持排序{a:-1:b:1}/{a:1:b:-1}
。字段的值是一个数组,就会自动把这个索引变成多值索引,支持范围查询。
包含两种索引:2d/2dsphere index
作用于值是字符串或者是字符串数组的字段,查询字段中是否包含查询字符串。
用于基于hash的sharding。
如果查询条件中出现使用了多个索引,包括Prefixes索引。mongodb可能会使用多个索引进行查询,然后取交集。是否使用了这个索引,可以通过explain
来确定。
当查询需要排序,同时排序的字段需要的索引和查询条件无法组成一个或者部分query predicate
,那就无法使用这个索引了。
比如:有索引{a:1}/{b:1,c:1}
,查询db.col.find({a:'a'}).sort({b:1})
无法使用,虽然排序中包含字段b
,但是查询条件中无法使用这个索引;而查询db.col.find({a:'a',b:'b'}).sort({c:1})
却可以使用两个索引,这是因为查询条件中有{b:'b'}
和排序字段{c:1}
,索引{b:1,c:1}
组成部分查询条件。
可以指定一个索引唯一。
只索引满足条件的文档,它是稀疏索引的超集,相比稀疏索引采用部分索引。
只索引存在该字段值的文档。
过期索引,针对值为日期或者日期数组的字段。如果字段值超过了过期日期,就会自动删除。过期时间可以动态修改的,有两种方式指定过期行为:
{a:[{b:1},{b:2}]}
。