# getIndexes() 查看集合的所有索引
db.col.getIndexes()
# getIndexKeys() 查看集合中的所有索引键
db.col.getIndexKeys()
# totalIndexSize() 查看集合中索引的总大小
db.col.totalIndexSize()
# getIndexSpecs() 查看集合各索引的详细信息
db.col.getIndexSpecs()
(mongo3.0以上版本)
createIndex() 创建索引
db.col.createIndex(keys, options)
col 为你自己的集合名
Key 值为你要创建的索引字段,1 为指定按升序创建索引,-1 按降序来创建索引。
createIndex() 接收可选参数,可选参数列表如下:
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. |
实例
创建一个普通索引,key表示字段名,1表示升序排序,-1表示降序。
# 创建一个普通索引,key表示字段名,1表示升序排序,-1表示降序。
db.col.createIndex({"name":1})
# 设置使用多个字段创建聚合索引(关系型数据库中称作复合索引)
db.col.createIndex({"name":1,"age":-1})
# 在后台创建索引,通过在创建索引时加 background:true 的选项,让创建工作在后台执行
db.col.createIndex({"name":1,"age":-1}, {background: true})
在后台创建索引的原因:
在前台创建索引期间会锁定数据库,会导致其它操作无法进行数据读写,在后台创建索引,会定期释放写锁,从而保证其它操作的运行,但是后台操作会在耗时更长,尤其是在频繁进行写入的服务器上。
所以创建索引应该注意以下几点:(MongoDB:创建索引需要注意的事项 - 简书)
数据前把索引创建好
如果已有数据在,要在后台创建索引
创建索引最好创建索引名称
复合索引在上边创建索引已经提到。
为了索引保存数组值的字段,MongoDB为数组中的每个元素创建一个索引键。这些多键索引支持对数组字段的有效查询。可以在既包含标量值[1](例如字符串,数字)又包含嵌套文档的数组上构造多键索引。
#多键索引创建 表示数组
db.coll.createIndex( { : < 1 or -1 > } )
稀疏索引仅包含具有索引字段的文档条目,即使索引字段包含空值也是如此。索引会跳过缺少索引字段的所有文档。索引是“稀疏的”,因为它不包括集合的所有文档。相反,非稀疏索引包含集合中的所有文档,为那些不包含索引字段的文档存储空值。
# 创建一个间隙索引
db.col.createIndex({"name":1}, { sparse: true })
部分索引仅索引集合中符合指定过滤器表达式的文档。
# 创建age大于5的部分索引
db.col.createIndex(
{ sex: 1, name: 1 },
{ partialFilterExpression: { age: { $gt: 5 } } }
)
# reIndex() 在name字段上重建倒序索引
db.col.reIndex({"name":-1})
#dropIndex() 删除集合指定的索引
db.col.dropIndex("索引名称")
#dropIndexes() 删除集合全部的索引
db.col.dropIndexes()
例子:
单个字段索引创建
@Data
@Document("person")
public class Person extends MongoEntity {
@Indexed
private String name;
private String age;
private String sex;
}
多字段创建索引
@Data
@Document("person")
@CompoundIndexes({
//创建一个名为compound的复合索引
@CompoundIndex(name = "compound", def = "{'age' : 1, 'sex': 1}")
})
public class Person extends MongoEntity {
@Indexed
private String name;
private String age;
private String sex;
}
间隙索引
@CompoundIndexes({
//创建一个名为compound的复合索引
@CompoundIndex(name = "compound", def = "{'age' : 1, 'sex': 1}",sparse = true)
})
部分索引
官方文档没有提供有关于partialFilterExpression构造的说明。
例子
单个索引
@Test
public void template() {
Index index = new Index();
index.on("name", Sort.Direction.ASC);
mongoTemplate.indexOps("person").ensureIndex(index);
for (int i=0;i<5;i++){
Person person = new Person();
person.setName("赵"+i);
person.setAge("2"+i);
person.setSex("男");
personService.save(person);
}
}
多个索引,我百度之后连续.on()即可以创建,但我尝试之后只有第一个索引成功。
@Test
public void template() {
Index index = new Index();
index.on("name", Sort.Direction.ASC)
.on("age", Sort.Direction.ASC) //不生效
.on("sex", Sort.Direction.ASC).sparse(); //不生效
mongoTemplate.indexOps("person").ensureIndex(index);
for (int i=0;i<5;i++){
Person person = new Person();
person.setName("赵"+i);
person.setAge("2"+i);
person.setSex("男");
personService.save(person);
}
}
间隙索引即.sarse()
部分索引
暂无。
mongoTemplate提供了增,删,删除全部,重建,查询这个五种接口。可以逐个尝试。
public interface IndexOperations {
void ensureIndex(IndexDefinition indexDefinition);
void dropIndex(String name);
void dropAllIndexes();
void resetIndexCache();
List getIndexInfo();
}