mongo-aggregate命令详解
⼀、aggregate执⾏流程和特性
1、执⾏流程:
db.collection.aggregate()是基于数据处理的聚合管道,每个⽂档通过⼀个由多个阶段(stage)组成的管道,可以对每个阶段的管道进⾏分组、过滤等功能,然后经过⼀系列的处理,输出相应的结果;
下图来⾃官⽅⽂档截图,作为aggregate运⾏过程图,⽅便⼤家了解;
2、特性:
db.collection.aggregate();
1. 可以进⾏多管道操作,能⽅便进⾏数据处理;
2. 使⽤了mongodb内置的原⽣sql操作,聚合效率⾮常⾼,⽀持类似于mysql中的group by功能;
3. 每个阶段管道限制为100MB的内存。如果⼀个节点管道超过这个极限,MongoDB将产⽣⼀个错误。为了能够在处理⼤型数据集,可
英文职位大全
以设置allowDiskU为true来在聚合管道节点把数据写⼊临时⽂件。这样就可以解决100MB的内存的限制;
4. 可以作⽤在分⽚集合,但结果不能输在分⽚集合,MapReduce可以作⽤在分⽚集合,结果也可以输在分⽚集合
5. ⽅法可以返回⼀个指针(cursor),数据放在内存中,直接操作。跟Mongo shell ⼀样指针操作;
cancel什么意思6. 输出的结果只能保存在⼀个⽂档中,BSON Document⼤⼩限制为16M。可以通过返回指针解决,版本2.6中后⾯:
⼆、aggregate语法: db.collection.aggregate(pipeline, options)
[pipeline参数]always什么意思
$group : 将集合中的⽂档分组,可⽤于统计结果,$group⾸先将数据根据key进⾏分组;
$project:可以对输⼊⽂档进⾏添加新字段或删除现有的字段,可以⾃定哪些字段显⽰与不显⽰;
$match :根据条件⽤于过滤数据,只输出符合条件的⽂档,如果放在pipeline前⾯,根据条件过滤数据,传输到下⼀个阶段管道,可以提⾼后续的数据处理效率。还可以放在out之前,对结果进⾏再⼀次过滤;
everything but the girl $redact :字段所处的document结构的级别;
$limit :⽤来限制MongoDB聚合管道返回的⽂档数;
$skip :在聚合管道中跳过指定数量的⽂档,并返回余下的⽂档;
$unwind :将⽂档中的某⼀个数组类型字段拆分成多条,每条包含数组中的⼀个值;
$sample :随机选择从其输⼊指定数量的⽂档。如果是⼤于或等于5%的collection的⽂档,$sample进⾏收集扫描,进⾏排序,然后选择顶部的⽂件。因此,$sample 在收集阶段是受排序的内存限制语法:{ $sample: { size: <positive integer> } }
$sort :将输⼊⽂档排序后输出;
$geoNear:⽤于地理位置数据分析;
$out :必须为pipeline最后⼀个阶段管道,因为是将最后计算结果写⼊到指定的collection中;
succeeding
whenever的用法 $indexStats :返回数据集合的每个索引的使⽤情况;语法:{ $indexStats: { } }
[pipeline例⼦]
插⼊test数据(红⾊区域表⽰插⼊成功)
[$group]
_id 是要进⾏分组的key,如果_id为null 相当于lect count(*) from table;
$sum:
统计test_order表条数 == 'lect count(*) as count from test_order';
统计test_order表 order_price总和 == 'lect sum(order_price) as total_order_price from test_order';
统计test_order表不同订单的order_price总和 == 'lect sum(order_price) as total_order_price from test_order group by order_type';
$min、$max :
四级真题及答案下载
统计test_order表中order_price最⼤价格和最⼩价格,不同订单的最⼤值和最⼩值 == 'lect max(order_price) as order_type_max_price from test_order group by order_type';
$avg
统计test_order表中order_price平均价格和不同订单的平均价格 == 'lect avg(order_price) as order_type_avg_price from test_order group by order_type';
$push、$addToSet
列举出test_order表中不同类型的订单价格数据都不要超出16M
$first、$last
统计test_order表中不同订单的第⼀条和最后⼀条的订单价格(如果有排序则按照排序,如果没有取⾃然first和last)
[$project]
根据需求去除test_order不需要展⽰的字段
高一英语一对一补习[$match]
查询不同订单售卖的总价格,其中总价格⼤于100的== 'lect sum(order_price) as order_type_sum_price from test_order group by
order_price having order_type_sum_price > 100';
shuriken
俄语电影查询order_type=3的总价 = 'lect sum(order_price) as total_price' from test_order where order_type = 3';
[$limit、$skip]
查询限制条数,和跳过条数可以使⽤在阶段管道⽤在$group 之前可以⼤⼤的提⾼查询性能
[$unwind]
可以拆分数组类型字段,其中包含数组字段值
[$out]
是把执⾏的结果写⼊指定数据表中
[options例⼦] explain:返回指定aggregate各个阶段管道的执⾏计划信息