当前位置:网站首页 / 数据库 / 正文

[AY-Mongo 3.x]写给自己的MongoDB笔记-深入浅出聚合管道【2/3】[7]

时间:2015年11月04日 | 作者 : aaronyang | 分类 : 数据库 | 浏览: 1427次 | 评论 0

2015年11月5日  ===== AYUI www.ayjs.net AY 杨洋原创编写,请不要转载谢谢====

管道操作符详细使用说明

    操作符介绍:

    $project:包含、排除、重命名和显示字段

    $match:查询,需要同find()一样的参数

    $limit:限制结果数量

    $skip:忽略结果的数量

    $sort:按照给定的字段排序结果

    $group:按照给定表达式组合结果

    $unwind:分割嵌入数组到自己顶层文件


①$project: 数据投影,主要用于重命名、增加和删除字段

db.students.aggregate({$project:{"teacher":1,"date":1}})



用sql的语句来对比和学习

Image 3.png

 select count(*) as count from students     这里的_id就好比group by的列名

换成Mongo:

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

blob.png

这里的count是别名,名字随便取,每条记录都执行sum累计后面的值

blob.png


②  select sum(age) as result  from students 累加年龄

换成Mongo:

db.students.aggregate([{$group:{ _id: null,result: { $sum: "$age" }}}])

blob.png



在写这个之前,我们来批量增加额外的列,city,第4个参数是否批量update

db.students.update({}, {$set:{city:'hf'}}, false, true);

blob.png

如果对update忘记的,可以参考:   点击打开

然后修改几个城市的

2015年11月5日  ===== AYUI www.ayjs.net AY 杨洋原创编写,请不要转载谢谢====

blob.png


③  select city,sum(age) as result  from students group by city累加年龄,按照指定 城市分组

换成Mongo:

db.students.aggregate([{$group:{ _id: "$city",result: { $sum: "$age" }}}])


blob.png


④上面的例子发现这个管道才一个处理单元,就是group,我们再增加sort单元来处理,管道你可以理解为流水线,中间很多处理阶段,就是一块一块的处理

 select city,sum(age) as result  from students group by city order by result

换成mongo:

db.students.aggregate([{$group:{ _id: "$city",result: { $sum: "$age" }}},{$sort:{result:1}}])

查询出来,按照result升序显示,后面reuslt:1     这里的1大于0就是升序,小于0就是降序。

blob.png

换成-1  降序显示

blob.png


增加province列

db.students.update({}, {$set:{province:'ah'}}, false, true);

然后,修改值

blob.png

js代表江苏,nt代表南通


⑤ 分组多列 

 select provice as p,city as c,sum(age) as result  from students group by province,city order by result

换成mongo:

db.students.aggregate([{$group:{ _id: {
        p:"$province",
	c:"$city"
},result: { $sum: "$age" }}},{$sort:{result:1}}])

这里的_id后的值变成了一个集合{p:"$province",c:"$city"}

blob.png

这里多个排序,只需要在括号里继续加,例如  {$sort:{result:1,age:1}}





⑦⑧⑨⑩⑥mongo中的having,就是$match,group分组后,每组中的处理

过滤每组中累加后年龄总和小于25岁的  记录

select provice as p,city as c,sum(age) as result  from students group by province,city having result>25

换成mongo:

db.students.aggregate([{$group:{ _id: {
        p:"$province",
	c:"$city"
},result: { $sum: "$age" }}},{$match:{result:{$gt:25}}}])

blob.png

显示组的数量select provice as p,city as c,sum(age) as result,count(*) as count  from students group by province,city having result>25

换成mongo

db.students.aggregate([{$group:{ _id: {
        p:"$province",
	c:"$city"
},count: { $sum: 1 },result: { $sum: "$age" }}},{$match:{result:{$gt:25}}}])

blob.png

关于和$sum等级的还有

blob.png

select provice as p,city as c,sum(age) as result  from students group by province,city having count(*)>2

换成mongo

db.students.aggregate([{$group:{ _id: {
        p:"$province",
	c:"$city"
},count: { $sum: 1 },result: { $sum: "$age" }}},{$match:{count:{$gt:1}}}])

blob.png

select provice as p,city as c,sum(age) as result  from students where name like 'a%' group by province,city 

换成mongo,把match放在前面

db.students.aggregate([{$match:{name:/^a/}},{$group:{ _id: {
        p:"$province",
	c:"$city"
 },count: { $sum: 1 },result: { $sum: "$age" }}
}])

blob.png

select provice as p,city as c,sum(age) as result  from students where name like 'a%' group by province,city having count(*)>2

换成mongo

db.students.aggregate([{$match:{name:/^a/}},{$group:{ _id: {
        p:"$province",
	c:"$city"
},count: { $sum: 1 },result: { $sum: "$age" }}},{$match:{count:{$gt:2}}}])

blob.png


$project类似select列出你要显示的列

增加一个hobby爱好列

db.students.update({}, {$set:{hobby:["羽毛球","看书","看电影","逛街"]}}, false, true);

blob.png

db.students.aggregate([{$project:{_id:0,name:1,age:1,city:1}}])

等同于sql的 select name,age,city from students

后面的1和0,代表是否显示,_id默认都是显示的,加上0就不显示了

blob.png


增加自定义名字的列,$add是加法函数

db.students.aggregate([{$project:{_id:0,name:1,age:1,city:1,maxAge:{$add:["$age",10]}}}])

blob.png

给原列取名字,例如 sage:"$age"

db.students.aggregate([{$project:{_id:0,name:1,age:1,sage:"$age",city:1,maxAge:{$add:["$age",10]}}}])

$unwind 分割数组,然后重组为单条文档

注意这里,显示列的时候,一定要加上后面的数组列,在这里数组列是hobby

db.students.aggregate({$project:{_id:0,name:1,age:1,city:1,hobby:1}},{$unwind:"$hobby"})

blob.png

如果$unwind目标字段不是一个数组的话,将会产生错误


db.students.aggregate( [   { $unwind: "$hobby" },   { $group: { _id: {
        p:"$province",
	c:"$city"
},qty: { $sum: "$items.qty" } } }] )

blob.png

分组后的分组

select count(*) from (select provice as p,city as c,sum(age) as result  from students where name like 'a%' group by province,city)  as tb

换成mongo

db.students.aggregate([{$match:{name:/^a/}},{$group:{_id: {
        p:"$province",
	c:"$city"
 },count: { $sum: 1 },result: { $sum: "$age" }}},{$group:{_id:null,result1: { $sum: 1}}
}])


blob.png


2015年11月5日  ===== AYUI       www.ayjs.net      AY         杨洋原创编写,请不要转载谢谢====


推荐您阅读更多有关于“mongodb,”的文章

猜你喜欢

额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

  查看权限

抖音号:wpfui,可以看到我的很多作品效果

AYUI8社区版Github地址:前往获取

作者:杨洋(AaronYang简称AY,安徽六安人)目前是个人,还没公司AY唯一QQ:875556003和AY交流

高中学历,2015年1月17日开始,兴趣学习研究WPF

声明:AYUI7个人与商用免费,源码可购买。部分DEMO不免费.AY主要靠卖技术服务挣钱

不是从我处购买的ayui7源码,我不提供任何技术服务,如果你举报从哪里买的,我可以帮你转正为我的客户,并送demo

查看捐赠

AYUI7.X MVC教程 更新如下:

第一课 第二课 程序加密教程

兼容XP到win10,vs2015/2019,最新AYUI:7.6.5.2

vs2015 企业版密钥HM6NR-QXX7C-DFW2Y-8B82K-WTYJV

vs2017 企业版密钥NJVYC-BMHX2-G77MM-4XJMR-6Q8QF

标签列表