【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的索引

相关推荐
范什么特西13 小时前
回答知识总结04(redis)
数据库·redis·缓存
码农颜14 小时前
5.4.1 锁分类
java·数据库·mysql
云深处@14 小时前
【数据库】MySQL 入门
数据库·学习·mysql
梦远星帆14 小时前
SQLyog社区版下载
数据库·mysql·sqlyog
科力锐品牌君16 小时前
行业龙头|科力锐全链路防勒索 + 多中心容灾方案,构筑河南翔宇医疗业务安全闭环!
网络·数据库·分布式·安全·数据安全·备份
zyplayer-doc16 小时前
zyplayer-doc企业知识库能做什么:从文档创建、权限管理到AI问答的完整能力
大数据·javascript·数据库·人工智能·pdf·word
会编程的吕洞宾18 小时前
LangChain4j Tool Calling 实战:让大模型自动查数据库发邮件,一句话搞定复杂任务
数据库·人工智能
知行合一。。。19 小时前
DeepAgents--01--Agent和OpenClaw的相关概念
android·数据库
c2385619 小时前
# Mini OJ — 项目详解文档
开发语言·数据库·c++
DFT计算杂谈19 小时前
C4T交错磁体中的超导交织序向列涨落与自旋流环涨落的选择机制
大数据·数据库·人工智能