zoukankan      html  css  js  c++  java
  • MongoDB 聚合查询

    什么是 MongoDB 聚合框架

    • MongoDB 聚合框架(Aggregation Framework)是一个计算框架,它可以:
      • 作用在一个或几个集合上;
      • 对集合中的数据进行的一系列运算;
      • 将这些数据转化为期望的形式;
    • 从效果而言,聚合框架相当于 SQL 查询中的:
      • GROUP BY
      • LEFT OUTER JOIN
      • AS等

    管道(Pipeline)和步骤(Stage)

    • 整个聚合运算过程称为管道(Pipeline),它是由多个步骤(Stage)组成的,每个管道:
      • 接受一系列文档(原始数据);
      • 每个步骤对这些文档进行一系列运算;
      • 结果文档输出给下一个步骤;

    聚合运算的基本格式

    pipeline = [$statge1, $stage2, ...$stageN];
    
    db.<COLLECTION>.aggregate(
    	pipeline,
    	{	options }
    );
    

    常见步骤

    步骤 作用 SQL等价运算符
    $match 过滤 WHERE
    $project 投影 AS
    $sort 排序 ORDER BY
    $group 分组 GROUP BY
    $skip/$limit 结果限制 SKIP/LIMIT
    $lookup 左外连接 LEFT OUTER JOIN

    常见步骤中的运算符

    $match $project $group
    $eq/$gt/$gte/$lt/$lte 选择需要的或排除不需要的字段 $sum/$avg
    $and/$or/$not/$in $map/$reduce/$filter $push/$addToSet
    $geoWithin/$intersect $range $first/$last/$max/$min
    $multiply/$divide/$substract/$add
    $year/$month/$dayOfMonth/$hour/$minute/$second
    步骤 作用 SQL等价运算符
    $unwind 展开数组 N/A
    $graphLookup 图搜索 N/A
    N/A

    聚合运算的使用场景

    聚合查询可以用于OLAP和OLTP场景。例如:

    OLTP OLAP
    计算 分析一段时间内的销售总额、均值
    计算一段时间内的净利润
    分析购买人的年龄分布
    分析学生成绩分布
    统计员工绩效

    MQL 常用步骤与 SQL 对比

    SELECT 
    	FIRST_NAME AS `名`,
    	LAST_NAME AS `姓`,
    FORM Users
    WHERE GENDER = '男'
    SKIP 100
    LIMIT 20
    
    db.users.aggregate([
    	{$match: {gender: "男"}},
    	{$skip: 100},
    	{$limit: 20},
    	{$project: {
    		"名": $first_name,
    		"姓": $last_name
    	}}
    ]);
    
    SELECT DEPARTMENT,
    	COUNT(NULL) AS EMP_QTY 
    FROM Users
    WHERE GENDER = '女'
    GROUP BY DEPARTMENT HAVING
    COUNT(*) < 10
    
    db.users.aggregate([
    	{$match: {gender: '女'}},
    	{$group: {
    		_id: $DEPARTMENT,
    		emp_qty: {$sum: 1}
    	}},
    	{$match: {$emp_qty: {$lt: 10}}}
    ]);
    

    MQL 特有步骤 $unwind

    $unwind指定字段进行子文档展开,其他字段不动

    > db.students.findOne()
    {
    	name: "张三",
    	score: [
    		{subject: "语文", score: 84},
    		{subject: "数学", score: 90},
    		{subject: "外语", score: 69},
    	]
    }
    > db.students.aggregate([$unwind: $score])
    {name: "张三", score: {subject: "语文", score: 84}}
    {name: "张三", score: {subject: "数学", score: 90}}
    {name: "张三", score: {subject: "外语", score: 69}}
    

    MQL 特有步骤 $bucket

    $bucket指定字段按指定区间进行分组统计

    MQL 特有步骤 $facet

    $facet指定多个字段分别$bucket分组统计

  • 相关阅读:
    A1141. PAT Ranking of Institutions
    A1140. Look-and-say Sequence
    A1139. First Contact
    A1138. Postorder Traversal
    A1137. Final Grading
    A1136. Delayed Palindrome
    A1135. Is It A Red-Black Tree
    A1134. Vertex Cover
    A1133. Splitting A Linked List
    layer.open打开iframe页面的调用父页面方法及关闭
  • 原文地址:https://www.cnblogs.com/niuben/p/14887485.html
Copyright © 2011-2022 走看看