【MongoDB】索引 - 单字段索引

MongoDB支持在集合文档中的任意字段上创建索引,默认情况下所有的集合都有一个_id字段的索引,用户和应用可以新增索引用于查询和操作。

一、准备工作

这里准备一些学生数据

bash 复制代码
db.students.insertMany([
    { _id: 1,  name: "张三", age: 20, class: { id: 1, name: "1班" }},
    { _id: 2,  name: "李四", age: 22, class: { id: 2, name: "2班" }},
    { _id: 3,  name: "王五", age: 24, class: { id: 3, name: "3班" }},
]);

二、查询索引

bash 复制代码
db.students.getIndexes();

上面我们查询了students集合中的索引列表

查询结果如下:

bash 复制代码
[ { v: 2, key: { _id: 1 }, name: '_id_' } ]

默认情况下,students集合中存在一个_id字段的索引;

三、创建索引

1、创建索引

bash 复制代码
db.students.createIndex({age: 1});

上面创建了age字段的正序索引,其中1代表的是按照age的值正序排序的索引,如果是-1代表的是按照age的值倒序排序的索引

2、查询索引

bash 复制代码
db.students.getIndexes();

结果如下:

bash 复制代码
[
  { v: 2, key: { _id: 1 }, name: '_id_' },
  { v: 2, key: { age: 1 }, name: 'age_1' }
]

可以看到多了一个名称为age_1的索引

3、执行查询

bash 复制代码
db.students.find({
    age: {
        $gt: 21
    }
})

结果如下:

bash 复制代码
[
  { _id: 2, name: '李四', age: 22, class: { id: 2, name: '2班' } },
  { _id: 3, name: '王五', age: 24, class: { id: 3, name: '3班' } }
]

4、查询过程

bash 复制代码
db.students.find({ age: { $gt: 21 } }).explain();

结果如下:

可以看到查询过程中会使用到索引名称为age_1的索引

四、创建内部文档索引

1、创建索引

bash 复制代码
db.students.createIndex({'class.name': -1});

上面创建了class字段下name字段的倒序索引,其中-1代表的是按照class字段下name字段的值倒序排序的索引,如果是1代表的是按照class字段下name字段的值正序排序的索引

注意:由于是内部文档,字段的引用中间需要使用符号(.)进行分割,索引key值两侧我们需要加上单引号

2、查询索引

bash 复制代码
db.students.getIndexes();

结果如下:

bash 复制代码
[
  { v: 2, key: { _id: 1 }, name: '_id_' },
  { v: 2, key: { age: 1 }, name: 'age_1' },
  { v: 2, key: { 'class.name': -1 }, name: 'class.name_-1' }
]

可以看到多了一个名称为class.name_-1的索引

3、执行查询

bash 复制代码
db.students.find({ 'class.name': '1班'})

结果如下:

bash 复制代码
[ { _id: 1, name: '张三', age: 20, class: { id: 1, name: '1班' } } ]

4、查询过程

bash 复制代码
db.students.find({ 'class.name': '1班'}).explain();

结果如下:

可以看到查询过程中会使用到索引名称为class.name_-1的索引

相关推荐
web151173602233 小时前
Redis--模糊查询--方法实例
数据库·redis·缓存
TT-Kun3 小时前
MySQL | 库操作
数据库·mysql
GreatSQL社区3 小时前
【GreatSQL优化器-15】index merge
数据库·oracle
PengShuaiD54 小时前
【数据库维护】如何解决Clickhouse数据库Too many parts报错
数据库·clickhouse
TechNomad4 小时前
C++访问MySQL数据库
数据库·c++·mysql
数据的世界015 小时前
Deepin(Linux)安装MySQL指南
数据库·mysql
左灯右行的爱情6 小时前
Redis-事务
数据库·redis·bootstrap
V1ncent Chen7 小时前
MySQL 插入更新语句(insert…on duplicate key update语句 )
数据库·sql·mysql
web150850966417 小时前
给SQL server数据库表字段添加注释SQL,附修改、删除注释SQL及演示
数据库·sql·oracle
qwy7152292581637 小时前
20-R 绘图 - 饼图
开发语言·数据库·r语言