mongodb索引及运用

mongodb 查看、创建、修改、删除索引

查看索引

# 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() 接收可选参数,可选参数列表如下:

ParameterTypeDescription
backgroundBoolean建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false
uniqueBoolean建立的索引是否唯一。指定为true创建唯一索引。默认值为false.
namestring索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。
dropDupsBoolean3.0+版本已废弃。在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false.
sparseBoolean对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.
expireAfterSecondsinteger指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。
vindex version索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。
weightsdocument索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。
default_languagestring对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语
language_overridestring对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的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:创建索引需要注意的事项 - 简书)

  1. 数据前把索引创建好

  2. 如果已有数据在,要在后台创建索引

  3. 创建索引最好创建索引名称

复杂索引创建

复合索引在上边创建索引已经提到。

多键索引

为了索引保存数组值的字段,MongoDB为数组中的每个元素创建一个索引键。这些多键索引支持对数组字段的有效查询。可以在既包含标量值[1](例如字符串,数字)又包含嵌套文档的数组上构造多键索引。

#多键索引创建 <field> 表示数组
db.coll.createIndex( { <field>: < 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()

Springboot 创建mongodb 索引

注解索引

例子:

单个字段索引创建

@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构造的说明。

mongoTemplate构建索引

例子

单个索引

	@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<IndexInfo> getIndexInfo();
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

答 案

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值