SQL中的聚合函数和Mongodb中的管道相互对应的关系:

WHERE	             $match
GROUP BY $group
HAVING $match
SELECT $project
ORDER BY $sort
LIMIT $limit
SUM() $sum
COUNT() $sum
join $lookup

例子:

先创建文档,填充数据

/* 0 */
{
"_id" : ObjectId("5812b447311bb4272016496a"),
"cust_id" : "abc123",
"ord_date" : ISODate("2012-11-02T17:04:11.102Z"),
"status" : "A",
"price" : 50,
"items" : [{
"sku" : "xxx",
"qty" : 25,
"price" : 1
}, {
"sku" : "yyy",
"qty" : 25,
"price" : 1
}]
} /* 1 */
{
"_id" : ObjectId("58131494311bb418b058fcba"),
"cust_id" : "a",
"ord_date" : ISODate("2012-11-02T17:04:11.102Z"),
"status" : "B",
"price" : 70,
"items" : [{
"sku" : "xxx",
"qty" : 25,
"price" : 1
}, {
"sku" : "yyy",
"qty" : 25,
"price" : 1
}]
} /* 2 */
{
"_id" : ObjectId("581314b6311bb418b058fcbb"),
"cust_id" : "ab",
"ord_date" : ISODate("2012-11-02T17:04:11.102Z"),
"status" : "E",
"price" : 60,
"items" : [{
"sku" : "xxx",
"qty" : 55,
"price" : 1
}, {
"sku" : "yyy",
"qty" : 25,
"price" : 1
}]
}

例1:

SQL:

SELECT COUNT(*) AS count  FROM orders

  

Mongodb:

db.orders.aggregate([
  {
    $group:{
          _id:null,
          count:{$sum:1}
        }
  }
])

例2:

SQL:

SELECT SUM(price) AS total FROM orders

Mongodb:

db.orders.aggregate(
         [
          {
            $group:             {
            _id:null,
            total:{$sum:"$price"}
            }
          }
        ])

例3:

SQL:

SELECT cust_id,SUM(price) AS total FROM orders GROUP BY cust_id

Mongodb:

db.orders.aggregate([
            {
              $group:
                  {
                     _id:"$cust_id",
                    total:
                      {
                       $sum:"$price"
                      }
                  }
            },
            {               $sort:
                {
                  total:1
                }
            }           ])  

例4:

SQL:

SELECT cust_id, ord_date,SUM(price) AS total  FROM orders  GROUP BY cust_id, ord_date

Mongodb:

db.orders.aggregate([
{
    $group:
    {
      _id:
     {
       cust_id:"$cust_id",
       ord_date:
            {
            month:{$month:"$ord_date"},
            day:{$dayOfMonth:"$ord_date"},
            year:{$year:"$ord_date"}
            }
      },
      total:{$sum:"$price"}      }
}
])

例5:

SQL:

SELECT cust_id,count(*) FROM orders GROUP BY cust_id  HAVING count(*) > 1

Mongodb:

db.orders.aggregate([
{
$group:{_id:"$cust_id",
count:{$sum:1}
}
},
{$match:{count:{$gt:1}}} ])

例6:

SQL:

SELECT cust_id,ord_date,SUM(price) AS total  FROM orders  GROUP BY cust_id,ord_date  HAVING total > 250

Mongodb:

db.orders.aggregate( [
{
$group: {
_id: {
cust_id: "$cust_id",
ord_date: {
month: { $month: "$ord_date" },
day: { $dayOfMonth: "$ord_date" },
year: { $year: "$ord_date"}
}
},
total: { $sum: "$price" }
}
},
{ $match: { total: { $gt: 250 } } }
] )

例6:

SQL:

SELECT cust_id,SUM(price) as total FROM orders WHERE status = 'A' GROUP BY cust_id

Mongodb:

db.orders.aggregate([
{$match:{status:'A'}},
{$group:{_id:"$cust_id",total:{$sum:"$price"}}}
])

例7:

SQL:

SELECT cust_id,SUM(price) as total FROM orders WHERE status = 'A' GROUP BY cust_id HAVING total > 250

Mongodb:

db.orders.aggregate([
{ $match: { status: 'A' } },
{$group:{_id:"$cust_id",total:{$sum:"$price"}}},
{$match:{total:{$gt:250}}}
])

例8:

SQL:

SELECT cust_id,SUM(li.qty) as qty FROM orders o, order_lineitem li WHERE li.order_id = o.id GROUP BY cust_id

Mongodb:

$unwind的作用是将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值

假如我们的需求是统计每个items出现的次数

这个时候就需要用到先将$unwind items拆分,然后根据具体的items来做分组统计

db.orders.aggregate([
{$unwind:"$items"},
{$group:{_id:"$cust_id",qty:{$sum:"$items.qty"}}}
])

例9:  

SQL:

SELECT COUNT(*) FROM (SELECT cust_id,ord_date FROM orders GROUP BY cust_id,ord_date) as DerivedTable

Mongodb:

db.orders.aggregate([
{$group:
{
_id:{
cust_id:"$cust_id",
ord_date:{
month:{$month:"$ord_date"},
day:{$dayOfMonth:"$ord_date"},
year:{$year:"$ord_date"}
}
}
}
},
{
$group:{
_id:null,
count:{$sum:1}
}
}
])

格式要注意

db.orders.aggregate([

{$match:{}},                ----where
{$group:{ ----group
    _id:排序字段
    total:{聚合函数}
}},
{$match:{}} ----having
])

 

  

  

     

 

SQL与Mongodb聚合的对应关系(举例说明)的更多相关文章

  1. MongoDB 聚合管道(Aggregation Pipeline)

    管道概念 POSIX多线程的使用方式中, 有一种很重要的方式-----流水线(亦称为"管道")方式,"数据元素"流串行地被一组线程按顺序执行.它的使用架构可参考 ...

  2. mongodb MongoDB 聚合 group

    MongoDB 聚合 MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 基本语法为:db.col ...

  3. MongoDB 聚合

    聚合操作过程中的数据记录和计算结果返回.聚合操作分组值从多个文档,并可以执行各种操作,分组数据返回单个结果.在SQL COUNT(*)和group by 相当于MongoDB的聚集. aggregat ...

  4. MongoDB聚合

    --------------------MongoDB聚合-------------------- 1.aggregate():     1.概念:         1.简介             ...

  5. mongodb MongoDB 聚合 group(转)

    MongoDB 聚合 MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 基本语法为:db.col ...

  6. mongodb聚合 group

    MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 基本语法为:db.collection.agg ...

  7. MongoDB 聚合(管道与表达式)

    MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). aggregate() 方法 MongoDB中 ...

  8. 【Mongodb教程 第十一课 】MongoDB 聚合

    聚合操作过程中的数据记录和计算结果返回.聚合操作分组值从多个文档,并可以执行各种操作,分组数据返回单个结果.在SQL COUNT(*)和group by 相当于MongoDB的聚集. aggregat ...

  9. mongodb聚合查询-aggregate

    Mongodb-aggregate 在工作中经常遇到一些mongodb的聚合操作,和mysql对比起来,mongo存储的可以是复杂的类型,比如数组,字典等mysql不善于处理的文档型结构,但是mong ...

随机推荐

  1. MVC3 数据验证用法之密码验证设计思路

    描述:MVC数据验证使用小结 内容:display,Required,stringLength,Remote,compare,RegularExpression 本人最近在公司用mvc做了一个修改密码 ...

  2. java的异常

    下面是我对Java异常知识的几个小总结,也算是资源回收一下 一.Java异常的知识 异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的.比如说,你的代码少了一个分号,那么运 ...

  3. Spring学习笔记之三----基于Annotation的Spring IOC配置

    使用Annotation 来创建Bean有两种方式 在配置类中创建bean(配置类是指标注为@Configuration的类),在配置类中每一个创建bean的方法都应该标注为@Bean,可以在@Bea ...

  4. 正则提取 html 里<input> 标记的value 值

    获取html 标记的值: :年月日 结果:您选择的是2014年1月22日 使用了Regex 对象,得到一个 MatchCollection,然后进行处理. string mes = @"&l ...

  5. Canny边缘检测

    1.Canny边缘检测基本原理      (1)图象边缘检测必须满足两个条件:一能有效地抑制噪声:二必须尽量精确确定边缘的位置.      (2)根据对信噪比与定位乘积进行测度,得到最优化逼近算子.这 ...

  6. DP专题训练之HDU 2955 Robberies

    打算专题训练下DP,做一道帖一道吧~~现在的代码风格完全变了~~大概是懒了.所以.将就着看吧~哈哈 Description The aspiring Roy the Robber has seen a ...

  7. 【转】破解Source Insight 3.5.0072过程 附:安装软件+注册机

    转载地址:http://blog.csdn.net/qs_hud/article/details/8884867 注册机及软件下载地址:http://download.csdn.net/detail/ ...

  8. Uva 11248 网络扩容

    题目链接:https://vjudge.net/contest/144904#problem/A 题意:给定一个有向网络,每条边均有一个容量.问是否存在一个从点1到点N,流量为C的流.如果不存在,是否 ...

  9. tensorflow安装日志(PIP)

    最近刚刚接触深度学习,安装一下tf 环境:华硕Z170主板.i7 6700k.GTX1070.Ubuntu16.04.Python2.7 在这之前先装好了cuda8.0.cudnn5.0.caffe整 ...

  10. python 学习笔记十八 django深入学习三 分页,自定义标签,权限机制

    django  Pagination(分页) django 自带的分页功能非常强大,我们来看一个简单的练习示例: #导入Paginator>>> from django.core.p ...