博客
关于我
MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示)
阅读量:795 次
发布时间:2023-02-09

本文共 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 的索引和聚合功能,可以高效地进行数据分析和查询操作,充分发挥数据库性能。

转载地址:http://zcffk.baihongyu.com/

你可能感兴趣的文章
matlab利用guide编写简单计算器界面
查看>>
matlab功率谱_EEG信号alpha波beta波等的谱密度实现(1)-原理
查看>>
matlab图的连通性算法,matlab判别图的连通性.doc
查看>>
MATLAB如何固定text在图中的相对位置
查看>>
Matlab安装
查看>>
MATLAB实现交叉小波变换
查看>>
MATLAB实现各种概率密度函数(概率密度/分布/逆概率分布函数)
查看>>
MATLAB实现各种熵:香农熵、条件熵、模糊熵、样本熵等
查看>>
MATLAB实现各种离散概率密度函数(概率密度/分布/逆概率分布函数)
查看>>
MATLAB实现基于遗传算法/引力搜索算法优化新安江水文模型
查看>>
Maven学习总结(23)——Maven常用命令介绍
查看>>
maven常用命令集合(收藏大全)
查看>>
Maven项目怎样重新下载依赖
查看>>
MBA中的企业金融课程涉及什么内容
查看>>
MC新手入门(二十二)------ 游戏场景
查看>>
md5 16位及32位
查看>>
MD5的算法(C)
查看>>
MDX Cookbook 12 - 计算 SMA 简单移动平均 LastPeriods() 函数的使用
查看>>
Meanshift,聚类算法
查看>>
media="screen"啥意思?
查看>>