MongoDB聚合操作、索引
一、聚合表达式
1.获取字段信息
$<field>:用$指示字段路径
$<field>.<subfield>:使用$和.来指示内嵌文档的路径
2.常量表达式
$literal:<value>:指示常量<value>
3.系统变量表达式
$$<variable>使用$$指示系统变量
$$CURRENT指示管道中当前操作的文档
4.聚合管道阶段
$project对输入文档进行再次投影
$match对输入文档进行筛选
$limit筛选出管道内前N篇文档
$skip跳过管道内前N篇文档
$unwind展开输入文档中的数组字段
$sort对输入文档进行排序
$lookup对输入文档进行查询操作
$group对输入文档进行分组
$out对管道中的文档输出
group聚合操作默认不会对输出结果进行排序
对于group,聚合操作主要有以下几种
$addToSet:将分组中的元素添加到一个数组中,并且自动去重
$avg返回分组中的平均值,非数值直接忽略
$first返回分组中的第一个元素
$last返回分组中的最后一个元素
$max返回分组中的最大元素
$min回分组中的最小元素
$push创建新的数组,将值添加进去
$sum求分组数值元素和
二、管道优化
1.投影优化聚合管道可以确定它是否仅需要文档中的字段的子集来获得结果。如果是这样,管道将只使用那些必需的字段,减少通过管道的数据量。
2.管道符号执行顺序优化对于包含投影阶段($project或$unset或$addFields或$set)后跟$match阶段的聚合管道,MongoDB将$match阶段中不需要在投影阶段计算的值的任何过滤器移动到投影前的新$match阶段
3.$sort+$match如果序列中带有$sort后跟$match,则$match会移动到$sort之前,以最大程度的减少要排序的对象的数量
4.$project/$unset+$skip序列优化当有一个$project或$unset之后跟有$skip序列时,$skip会移至$project之前。
5.$limit+$limit合并当$limit紧接着另一个时$limit,两个阶段可以合并为一个阶段$limit,其中限制量为两个初始限制量中的较小者。
6.skip+$skip合并当$skip紧跟另一个$skip,这两个阶段可合并成一个单一的$skip,其中跳过量为总和的两个初始跳过量。
7.$match+$match合并当一个$match紧随另一个紧随其后时$match,这两个阶段可以合并为一个单独$match的条件$and
三、索引
索引是特殊的数据结构,它以一种易于遍历的形式存储集合数据集的一小部分。索引存储一个或一组特定字段的值,按字段的值排序。索引项的排序支持有效的相等匹配和基于范围的查询操作。此外,MongoDB可以通过使用索引中的排序返回排序后的结果。
特点 1.索引支持更快的查询 2.更快的排序
1.单键索引
默认id索引,在创建集合期间,MongoDB在_id字段上创建唯一索引。该索引可防止客户端插入两个具有相同值的文档。你不能将_id字段上的index删除。
2.复合索引
MongoDB支持在多个字段上创建用户定义索引,即复合索引。对于复合索引和排序操作,索引键的排序顺序(升序或降序)可以决定索引是否支持排序操作。
3.多键索引
MongoDB使用多键索引来索引存储在数组中的内容。如果索引包含数组值的字段,MongoDB为数组的每个元素创建单独的索引项。数组字段中的每一个元素,都会在多键索引中创建一个键
4.索引的效果解析
可以使用explain进行分析的操作包含aggregate,count,distinct,find,group,remove,updatewinningPlan:
stage的值含义COLLSCAN:整个集合扫描IXScan:索引扫描FETCH:根据索引指向的文档的地址进行查询SORT:需要再内存中排序,效率不高
5.索引的唯一性
索引的unique属性使MongoDB拒绝索引字段的重复值。除了唯一性约束,唯一索引和MongoDB其他索引功能上是一致的
如果文档中的字段已经出现了重复值,则不可以创建该字段的唯一性索引如果新增的文档不具备加了唯一索引的字段,则只有第一个缺失该字段的文档可以被添加,索引中该键值被置为null。复合键索引也可以具有唯一性,这种情况下,不同的文档之间,其所包含的复合键字段值的组合不可以重复。
6.索引的稀疏性
索引的稀疏属性可确保索引仅包含具有索引字段的文档的条目。索引会跳过没有索引字段的文档。可以将稀疏索引与唯一索引结合使用,以防止插入索引字段值重复的文档,并跳过索引缺少索引字段的文档。
7.索引的生存时间
针对日期字段,或者包含了日期元素的数组字段,可以使用设定了生存时间的索引,来自动删除字段值超过生存时间的文档。
8.复合键索引不具备生存时间的特性
当索引键是包含日期元素的数组字段时,数组中最小的日期将被用来计算文档是否已经过期数据库使用一个后台线程来监测和删除过期的文档,删除操作可能会有一定的延迟

浙公网安备 33010602011771号