SQL与Mongodb聚合的对应关系(举例说明)
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聚合的对应关系(举例说明)的更多相关文章
- MongoDB 聚合管道(Aggregation Pipeline)
管道概念 POSIX多线程的使用方式中, 有一种很重要的方式-----流水线(亦称为"管道")方式,"数据元素"流串行地被一组线程按顺序执行.它的使用架构可参考 ...
- mongodb MongoDB 聚合 group
MongoDB 聚合 MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 基本语法为:db.col ...
- MongoDB 聚合
聚合操作过程中的数据记录和计算结果返回.聚合操作分组值从多个文档,并可以执行各种操作,分组数据返回单个结果.在SQL COUNT(*)和group by 相当于MongoDB的聚集. aggregat ...
- MongoDB聚合
--------------------MongoDB聚合-------------------- 1.aggregate(): 1.概念: 1.简介 ...
- mongodb MongoDB 聚合 group(转)
MongoDB 聚合 MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 基本语法为:db.col ...
- mongodb聚合 group
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). 基本语法为:db.collection.agg ...
- MongoDB 聚合(管道与表达式)
MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). aggregate() 方法 MongoDB中 ...
- 【Mongodb教程 第十一课 】MongoDB 聚合
聚合操作过程中的数据记录和计算结果返回.聚合操作分组值从多个文档,并可以执行各种操作,分组数据返回单个结果.在SQL COUNT(*)和group by 相当于MongoDB的聚集. aggregat ...
- mongodb聚合查询-aggregate
Mongodb-aggregate 在工作中经常遇到一些mongodb的聚合操作,和mysql对比起来,mongo存储的可以是复杂的类型,比如数组,字典等mysql不善于处理的文档型结构,但是mong ...
随机推荐
- poj 2515 差分序列,排列组合
大神博客链接 http://blog.csdn.net/kksleric/article/details/8021276 这道题的差分序列从没看过,公式题. 先构造从0到m的第p阶差分序列,算出0^p ...
- SSO
- 使用filter获取http请求的出参以及入参
首先 我们的目的是做一个拦截器 能够对http请求做profiler,能够记录本次的调用情况,这里说下如何从http请求中获取到出参的问题. 方案一:参照http://blog.csdn.net/wu ...
- windows programming can't find windows.h
在用控制台编译c++程序的时候,可能会遇到找不到windows.h的情况.这是因为我们在使用cl命令的时候,并没有配置好环境变量. 所以我们在运行cl命令之前,我们可以运行C:\Program Fil ...
- js阻止form表单重复提交
防止表单重复提交的方法总体来说有两种,一种是在js中阻止重复提交:另一种是在后台利用token令牌实现,大致思路是生成一个随机码放到session和form表单的隐藏输入框中,提交表单时两者对比,表单 ...
- 2.[WP Developer体验Andriod开发]Andriod Studio结合Visual Studio Emulator for Android调试Android App
0. 工欲善其事必先利其器 上一篇博客对比了一下Android和WinPhnoe的布局容器,后续篇章重点放在Android的开发上了. 说到开发就绕不开调试程序,调试Android App我们有2种选 ...
- excel 怎么修饰图表
文中的图表只是方便以后记忆,故不详,具体细节没有截图保存,详细了解的,请自行百度
- 第十一章 GUI 上
第11章 GUI程序设计 11.1 JFC简介 JFC(Java Foundation Class) 作为CUI(Graphic User Interface)设计的基础.JFC包含AWT(Abst ...
- 输入5至10之间的数字(用javaScript实现判断)
输入5至10之间的数字 ----用javaScript实现判断 代码如下: <!DOCTYPE html><html><body> <script>fu ...
- 第三天的学习知识HTML5常用的重要单词
a: a:猫 address:地址 alt:替用(一般是图片显示不出的提示) b: b:粗体 br:换行 background:背景 border:边框 ...