
MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示)
发布日期:2025-04-14 14:11:20
浏览次数:9
分类:精选文章
本文共 4330 字,大约阅读时间需要 14 分钟。
MongoDB 索引与聚合指南
一、MongoDB 索引
在 MongoDB 中,索引起到了关键作用。它类似于传统数据库中的索引,能够显著提升查询效率。如果没有索引,查询操作可能需要遍历整个集合,导致效率低下。索引是一种特殊的数据结构,它存储在易于遍历的数据集合中,对数据库表中一列或多列值进行排序。
1.1 索引说明
MongoDB 的索引与 MySQL 的索引十分类似。索引通过为数据库查询提供快速访问的方式,显著提升查询效率。没有索引时,查询操作需要从集合中扫描所有文档,这种方式效率极低。索引是对数据库表中一列或多列值进行排序的数据结构,存储在一个易于遍历的数据集合中。
1.2 索引原理
MongoDB 的索引原理基于以下逻辑:
假设有一个users
集合,每个文档都包含 score
属性。如果需要查询分数小于 30 的文档,在没有索引的情况下,查询需要扫描全集数据,将符合条件的文档收集到结果集中。为提高查询效率,可以对 score
建立索引。索引的创建会对指定的字段按照升序或降序进行排序,并将排序后的值存储在索引库中。这样,在查询分数小于 30 的文档时,可以直接从排序好的索引中获取分数对应的文档指针,从而快速获取所需文档。 1.3 索引操作
1.3.1 创建索引
创建索引是提升数据库性能的重要操作。以下是创建索引的基本语法:
db.集合名.createIndex(keys, options)
示例:
db.index.find();{ "_id" : 0, "name" : "cyk0", "age" : 20},{ "_id" : 1, "name" : "cyk1", "age" : 21}...>db.index.createIndex({name: 1, age: -1});{ "numIndexesBefore" : 1, "numIndexesAfter" : 2, "createdCollectionAutomatically" : false, "ok" : 1}
语法说明:
keys
表示要创建的索引对象,1 表示按升序,-1 表示按降序。options
包括以下可选参数(黄色标记为常用参数):background
:指定是否在后台创建索引,默认值为false
。unique
:指定索引是否唯一,默认值为false
。name
:索引名称,若不指定,MongoDB会自动生成。sparse
:若设置为true
,索引只包含存在字段的文档。expireAfterSeconds
:指定索引的生存时间(TTL)。weights
:指定索引字段的权重值。default_language
:指定文本索引的语言,默认为英语。language_override
:指定字段名称,覆盖language
参数的语言设置。
示例:
db.index.createIndex({age: 1}, {name: 'age_index'});{ "numIndexesBefore" : 1, "numIndexesAfter" : 2, "createdCollectionAutomatically" : false, "ok" : 1}
1.3.2 查看索引列表
要查看集合的索引列表,可以使用以下命令:
db.集合名.getIndexes()
1.3.3 查看索引大小
要查看集合的索引大小,可以使用以下命令:
db.集合名.totalIndexSize()
1.3.4 删除集合所有索引
要删除集合的所有索引,可以使用以下命令:
db.集合名.dropIndexes()
注意事项:
_id
索引不会被删除。
1.3.5 删除指定索引
要删除指定索引,可以使用以下命令:
db.index.dropIndex('索引名')
1.3.6 创建复合索引
MongoDB 支持创建复合索引。复合索引是由多个字段组成的索引,类似于传统数据库的复合索引。创建复合索引的语法如下:
db.集合名.createIndex({key, key, ...})
1.4 聚合
MongoDB 的聚合功能允许用户执行高级数据分析操作,类似于 SQL 中的聚合函数。常见的聚合操作包括求和、求差、平均值等。以下是一些常用聚合表达式:
表达式 | 描述 | 示例 |
---|---|---|
$sum | 计算总和 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]]) |
$avg | 计算平均值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]]) |
$min | 获取最小值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]]) |
$max | 获取最大值 | db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]]) |
$push | 将值加入数组 | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]]) |
$addToSet | 将值加入数组(无重复) | db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]]) |
$first | 获取第一个值 | db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]]) |
$last | 获取最后一个值 | db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]]) |
示例数据:
假设集合mycol
包含以下文档: [ { "_id": 1, "author": "cyk", "likes": 123 }, { "_id": 2, "author": "lyj", "likes": 456 }]
操作示例:
- a) 统计每个作者写的文章数使用聚合表达式
$count
:
db.mycol.aggregate([ { $group: { _id: "$author", count: { $sum: 1 } } }])
- b) 统计每个作者各自文章中点赞量的最大值使用聚合表达式
$max
:
db.mycol.aggregate([ { $group: { _id: "$author", max_likes: { $max: "$likes" } } }])
- c) 统计每个作者各自文章中点赞量的最小值使用聚合表达式
$min
:
db.mycol.aggregate([ { $group: { _id: "$author", min_likes: { $min: "$likes" } } }])
- d) 统计每个作者的平均点赞量使用聚合表达式
$avg
:
db.mycol.aggregate([ { $group: { _id: "$author", avg_likes: { $avg: "$likes" } } }])
- e) 获取每个作者的所有文章内容(不会去重)使用聚合表达式
$push
:
db.mycol.aggregate([ { $group: { _id: "$author", articles: { $push: "$url" } } }])
- f) 获取每个作者的所有文章内容(去重)使用聚合表达式
$addToSet
:
db.mycol.aggregate([ { $group: { _id: "$author", articles: { $addToSet: "$url" } } }])
- g) 获取每个作者第一个文章标题使用聚合表达式
$first
:
db.mycol.aggregate([ { $group: { _id: "$author", first_title: { $first: "$url" } } }])
- h) 获取每个作者最后一个文章标题使用聚合表达式
$last
:
db.mycol.aggregate([ { $group: { _id: "$author", last_title: { $last: "$url" } } }])
通过合理运用 MongoDB 的索引和聚合功能,可以高效地进行数据分析和查询操作,充分发挥数据库性能。
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年04月29日 23时26分36秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
linux软件包的一般安装方法
2025-04-10
linux软件包:RPM包、源码包、yum在线
2025-04-10
Linux进程地址管理之mm_struct
2025-04-10
Linux部署Elasticsearch(一):下载和部署Elasticsearch
2025-04-10
Linux(3):Linux命令-文件管理
2025-04-10
Linux:安装Redis
2025-04-10
ListBox 循环删除当前项
2025-04-10
Listview 利用Datapager进行分页
2025-04-10
listview数据刷新后自动滑到底部
2025-04-10
liunx-FTP服务器_无需整理
2025-04-11
Liunx挂载nfts盘数据方法
2025-04-11
LiveGBS user/save 逻辑缺陷漏洞复现(CNVD-2023-72138)
2025-04-11
live和on的区别
2025-04-11
LLM;超越记忆《第 2 部分 》
2025-04-11
LLVM 简介-ChatGPT4o作答
2025-04-11
localhost:5000在MacOS V12(蒙特利)中不可用
2025-04-11
localStorage使用总结
2025-04-11
Lock 锁底层实现
2025-04-11
Lock和synchronized区别(以及Lock的使用)
2025-04-11
logback配置文件详解
2025-04-11