MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示)

这篇具有很好参考价值的文章主要介绍了MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、MongoDB 索引

1.1、说明

1.2、原理

1.3、操作

1.3.1、创建索引

1.3.2、查看集合索引列表

1.3.3、查看集合索引大小

1.3.4、删除集合所有索引

1.3.5、删除集合指定索引

1.3.6、创建复合索引

1.4、聚合

a) 统计每个作者写的文章数

b)统计每个作者各自文章中点赞量的最大值

c)统计每个作者各自文章中点赞量的最小值

d) 统计每个作者的平均点赞量

e)统计每个作者的所有文章内容(不会去重)

f)统计每个作者的所有文章内容(去重)

g) 获取每个作者第一个文章标题.

h)获取每个作者最后一个文章标题.


一、MongoDB 索引


1.1、说明

MongoDB 中的索引和 MySQL 索引十分类似,能够极大的提高查询效率,如果没有索引,就需要扫描全集数据,效率非常低.  索引是一种特殊的数据结构,存储在一个易于遍历的读取的数据集合中,是对数据库表中一列或多列值进行排序的一种结构.

1.2、原理

下图来自于 MongoDB 官方文档:Indexes — MongoDB Manual

MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示),MongoDB,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 }
{ "_id" : 2, "name" : "cyk2", "age" : 22 }
{ "_id" : 3, "name" : "cyk3", "age" : 23 }
{ "_id" : 4, "name" : "cyk4", "age" : 24 }
{ "_id" : 5, "name" : "cyk5", "age" : 25 }
{ "_id" : 6, "name" : "cyk6", "age" : 26 }
{ "_id" : 7, "name" : "cyk7", "age" : 27 }
{ "_id" : 8, "name" : "cyk8", "age" : 28 }
{ "_id" : 9, "name" : "cyk9", "age" : 29 }
> 
> db.index.createindex({name: 1, age: -1})
{
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"createdCollectionAutomatically" : false,
	"ok" : 1
}

语法中的 key 表示要创建的索引对象,1 表示按照升序创建索引,-1 表示降序创建索引.

options 表示一些可选参数,如下(黄色标记为常用参数):

Parameter

Type

Description

background

Boolean

建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false。

有时候创建的索引特别大,就可能会阻塞,因此需要后台创建.

unique

Boolean

建立的索引是否唯一。指定为true创建唯一索引。默认值为false.

name

string

索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称。

sparse

Boolean

对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false.

expireAfterSeconds

integer

指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间。

v

index version

索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本。

weights

document

索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重。

default_language

string

对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语

language_override

string

对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language.

例如指定索引的名称:

> db.index.createIndex({age: 1}, {name: 'age_index'});
{
	"numIndexesBefore" : 1,
	"numIndexesAfter" : 2,
	"createdCollectionAutomatically" : false,
	"ok" : 1
}
> 
> db.index.getIndexes();
[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"age" : 1
		},
		"name" : "age_index"
	}
]
> 

1.3.2、查看集合索引列表

db.集合名.getIndexes()

MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示),MongoDB,mongodb,数据库

1.3.3、查看集合索引大小

db.集合名.totalIndexSize()

 MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示),MongoDB,mongodb,数据库

 

1.3.4、删除集合所有索引

db.集合名.dropIndexes()

MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示),MongoDB,mongodb,数据库

Ps:id 索引不会被删除.

1.3.5、删除集合指定索引

db.index.dropInde('索引名')

MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示),MongoDB,mongodb,数据库

1.3.6、创建复合索引

与 MySQL 的复合索引一样,一个索引值是由多个 key 进行维护的索引就是复合索引.

db.集合名.createIndex({key, key, ......})

MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示),MongoDB,mongodb,数据库

1.4、聚合

MongoDB 中的聚合主要用于处理 例如 求和、求差、平均值 等,并返回计算结果. 类似于 MySQL 中的 max()、count(*).

db.集合名.aggregate([{$group: {_id: '$要分组的字段', 自定义组名: {聚合表达式}}}])
表达式 描述 实例
$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"}}}])

例如数据如下:

MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示),MongoDB,mongodb,数据库

作者 cyk 写了文章 aaa 和 bbb,作者 lyj 写了文章 ccc.  likes 表示点赞量.

a) 统计每个作者写的文章数

MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示),MongoDB,mongodb,数据库

当然有需要,也可以对聚合的结果乘上一个倍数.

MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示),MongoDB,mongodb,数据库

b)统计每个作者各自文章中点赞量的最大值

MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示),MongoDB,mongodb,数据库

c)统计每个作者各自文章中点赞量的最小值

MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示),MongoDB,mongodb,数据库

d) 统计每个作者的平均点赞量

MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示),MongoDB,mongodb,数据库

e)统计每个作者的所有文章内容(不会去重)

MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示),MongoDB,mongodb,数据库

f)统计每个作者的所有文章内容(去重)

MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示),MongoDB,mongodb,数据库

g) 获取每个作者第一个文章标题.

MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示),MongoDB,mongodb,数据库

 

h)获取每个作者最后一个文章标题.

MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示),MongoDB,mongodb,数据库

MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示),MongoDB,mongodb,数据库文章来源地址https://www.toymoban.com/news/detail-806700.html

到了这里,关于MongoDB - 索引底层原理和使用,聚合的使用(案例 + 演示)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【MongoDB】--MongoDB聚合Aggregation

    聚合操作组值来自多个文档,可以对分组数据执行各种操作以返回单个结果。聚合操作包含三类: 单一作用聚合、聚合管道、MapReduce 。 单一作用聚合 :提供对常见聚合过程的简单访问,操作都从单个集合聚合文档 聚合管道操作 :将文档在一个管道处理完毕后,把处理的结

    2024年02月14日
    浏览(12)
  • Mongodb空间索引的使用以及与Django的对接

    Mongodb数据库大家都非常熟悉,是一个基于分布式文件存储的开源数据库系统,在高负载的情况下,添加更多的节点,可以保证服务器性能,数据结构由键值(key=value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。对与Mongodb还有一个非常重要

    2024年02月15日
    浏览(11)
  • Mongodb 多文档聚合操作处理方法(单一聚合)

    聚合操作处理多个文档并返回计算结果。您可以使用聚合操作来: 将多个文档中的值分组在一起。 对分组数据执行操作以返回单个结果。 分析数据随时间的变化。 要执行聚合操作,您可以使用: 聚合管道 单一目的聚合方法 Map-reduce 函数 所有这些操作都会聚合来自单个集合

    2024年02月16日
    浏览(6)
  • MongoDB聚合:$collStats

    聚合阶段 $collStates 用于返回集合或视图统计信息。 $collStats 接收一个文档参数,可选的字段如下: latencyStats 延迟统计信息 向返回结果添加延迟统计信息,包括读、写、命令、事务的时间。 latencyStats.histograms 延迟统计柱状图数据 当值为 true 时,向 latencyStats 内嵌文档中添加

    2024年01月19日
    浏览(8)
  • MongoDB聚合:$set

    聚合 $set 阶段可以为文档添加新的字段。 $set 输出的文档包含输入文档中的所有现有字段和新添加的字段。 $set 是 $addFields 的别名,从MongoDB4.2开始支持。 $set 和 $addFields 等价于 $project 阶段,这两个阶段都等同于 $project 阶段,后者明确指定输入文档中的所有现有字段并添加新

    2024年01月18日
    浏览(5)
  • MongoDB聚合:$project

    $project 聚合阶段可将输入文档根据请求的字段输出到管道的下个阶段,输出的字段可以是输入文档中的字段,也可以是新的计算字段。 $project 聚合接受一个文档参数,可以指定包含的字段,抑制 _id 字段,添加新的字段以及重置已有字段的值等。亦或者,也可以指定排除的字

    2024年02月20日
    浏览(9)
  • MongoDB聚合:$bucket

    $bucket 将输入文档按照指定的表达式和边界进行分组,每个分组为一个文档,称为“桶”,每个桶都有一个唯一的 _id ,其值为文件桶的下线。每个桶中至少要包含一个输入文档,也就是没有空桶。 语法 groupBy 对文档进行分组的表达式。若指定字段路径,需要在字段名前加上

    2024年01月23日
    浏览(9)
  • MongoDB聚合:$densify

    $densify 阶段可以为文档序列中字段缺失的某些值创建新文档。其主要的用途有: 补齐时间序列数据。 为分组数据添加缺失值。 为指定的值范围填充数据。 $densify 阶段的语法: $densify 阶段的参数主要有以下字段: field 必选字段,要填充的字段,字段的值必须是数值或日期类

    2024年02月20日
    浏览(5)
  • 整理mongodb文档:聚合管道

    整理mongodb文档:聚合管道

    整理mongodb文档:聚合管道 个人博客,求关注,电脑版看体验更加,如果不够清晰,请指出来,谢谢 文章主要通过几个常用的聚合表达式来介绍聚合管道的使用,以及从索引的角度来介绍聚合管道的限制,让大家对聚合管道有一个理解。 聚合操作处理数据记录和 return 计算结果

    2024年02月11日
    浏览(8)
  • MongoDB聚合操作:$changeStream

    返回集合、数据库或整个群集上的 Change Stream 游标。必须在聚合管道的第一阶段使用。 allChangesForCluster 可选:设置Change Stream是否包括群集中的所有更改。可能只能在管理数据库中打开。 fullDocument 可选:指定 update 操作修改时,更改通知是否包含完整文档的副本。 default :更

    2024年01月23日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包