本次左羊还是以Mysql与mongoDB对比的形式,展示mongodb的聚合查询。好了闲言少续,开始吧。

数据字典 | ||
库名 ming_dunasty 明朝 | ||
表名 hero 英雄 | ||
名称 | 类型 | 备注 |
id_number | int | 排序标识 |
name | String | 姓名 |
gender | String | 性别 |
position | String | 职位 |
note | String | 备注 |
MongoDB中聚合的方法使用aggregate()。
语法
aggregate() 方法的基本语法格式如下所示:
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
排序
倒序
Mysql
SELECT * from hero ORDER BY id_number desc
id_number | name | gender | position | note |
7 | 常遇春 | 男 | 侦察旅旅长 | 给朱元璋打工的 |
6 | 胡惟庸 | 男 | 宰相 | 给朱元璋打工的 |
5 | 徐达 | 男 | 元帅 | 给朱元璋打工的 |
4 | 刘伯温 | 男 | 谋士 | 给朱元璋打工的 |
3 | 陈友谅 | 男 | 霸主 | 被朱元璋打败 |
2 | 张士诚 | 男 | 霸主 | 被朱元璋打败 |
1 | 朱元璋 | 男 | 皇帝 | 洪武大帝 |
Mongo
> db.hero.aggregate({$sort:{"id_number":-1}}){ "_id" : ObjectId("60477e15d9fd4d508eb534d5"), "name" : "常遇春", "gender" : "男", "position" : "侦察旅旅长", "note" : "给朱元璋打工的", "id_number" : 7 }{ "_id" : ObjectId("60477e15d9fd4d508eb534d4"), "name" : "胡惟庸", "gender" : "男", "position" : "宰相", "note" : "给朱 元璋打工的", "id_number" : 6 }{ "_id" : ObjectId("60477e15d9fd4d508eb534d3"), "name" : "徐 达", "gender" : "男", "position" : "元帅", "note" : "给朱元璋打工的", "id_number" : 5 }{ "_id" : ObjectId("60477e15d9fd4d508eb534d2"), "name" : "刘伯温", "gender" : "男", "position" : "谋士", "note" : "给朱 元璋打工的", "id_number" : 4 }{ "_id" : ObjectId("60477e15d9fd4d508eb534d1"), "name" : "陈友谅", "gender" : "男", "position" : "霸主", "note" : "被朱 元璋打败", "id_number" : 3 }{ "_id" : ObjectId("60477e15d9fd4d508eb534d0"), "name" : "张士诚", "gender" : "男", "position" : "霸主", "note" : "被朱 元璋打败", "id_number" : 2 }{ "_id" : ObjectId("60477aced9fd4d508eb534cf"), "name" : "朱元璋", "gender" : "男", "position" : "皇帝", "note" : "洪武 大帝", "id_number" : 1 }
正序
Mysql
SELECT * from hero ORDER BY id_number asc
id_number | name | gender | position | note |
1 | 朱元璋 | 男 | 皇帝 | 洪武大帝 |
2 | 张士诚 | 男 | 霸主 | 被朱元璋打败 |
3 | 陈友谅 | 男 | 霸主 | 被朱元璋打败 |
4 | 刘伯温 | 男 | 谋士 | 给朱元璋打工的 |
5 | 徐达 | 男 | 元帅 | 给朱元璋打工的 |
6 | 胡惟庸 | 男 | 宰相 | 给朱元璋打工的 |
7 | 常遇春 | 男 | 侦察旅旅长 | 给朱元璋打工的 |
Mongo
> db.hero.aggregate({$sort:{"id_number":1}}){ "_id" : ObjectId("60477aced9fd4d508eb534cf"), "name" : "朱元璋", "gender" : "男", "position" : "皇帝", "note" : "洪武 大帝", "id_number" : 1 }{ "_id" : ObjectId("60477e15d9fd4d508eb534d0"), "name" : "张士诚", "gender" : "男", "position" : "霸主", "note" : "被朱 元璋打败", "id_number" : 2 }{ "_id" : ObjectId("60477e15d9fd4d508eb534d1"), "name" : "陈友谅", "gender" : "男", "position" : "霸主", "note" : "被朱 元璋打败", "id_number" : 3 }{ "_id" : ObjectId("60477e15d9fd4d508eb534d2"), "name" : "刘伯温", "gender" : "男", "position" : "谋士", "note" : "给朱 元璋打工的", "id_number" : 4 }{ "_id" : ObjectId("60477e15d9fd4d508eb534d3"), "name" : "徐 达", "gender" : "男", "position" : "元帅", "note" : "给朱元璋打工的", "id_number" : 5 }{ "_id" : ObjectId("60477e15d9fd4d508eb534d4"), "name" : "胡惟庸", "gender" : "男", "position" : "宰相", "note" : "给朱 元璋打工的", "id_number" : 6 }{ "_id" : ObjectId("60477e15d9fd4d508eb534d5"), "name" : "常遇春", "gender" : "男", "position" : "侦察旅旅长", "note" : "给朱元璋打工的", "id_number" : 7 }
重命名
Mysql
SELECT name,position as "职业" from hero
name | 职业 |
朱元璋 | 皇帝 |
张士诚 | 霸主 |
陈友谅 | 霸主 |
刘伯温 | 谋士 |
徐达 | 元帅 |
胡惟庸 | 宰相 |
常遇春 | 侦察旅旅长 |
Mongo
> db.hero.aggregate({$project:{"职业":"$position","name":1}}){ "_id" : ObjectId("60477aced9fd4d508eb534cf"), "name" : "朱元璋", "职业" : "皇帝" }{ "_id" : ObjectId("60477e15d9fd4d508eb534d0"), "name" : "张士诚", "职业" : "霸主" }{ "_id" : ObjectId("60477e15d9fd4d508eb534d1"), "name" : "陈友谅", "职业" : "霸主" }{ "_id" : ObjectId("60477e15d9fd4d508eb534d2"), "name" : "刘伯温", "职业" : "谋士" }{ "_id" : ObjectId("60477e15d9fd4d508eb534d3"), "name" : "徐 达", "职业" : "元帅" }{ "_id" : ObjectId("60477e15d9fd4d508eb534d4"), "name" : "胡惟庸", "职业" : "宰相" }{ "_id" : ObjectId("60477e15d9fd4d508eb534d5"), "name" : "常遇春", "职业" : "侦察旅旅长" }
分组
Mysql
SELECT position,count(*) from hero GROUP BY position
position | count(*) |
侦察旅旅长 | 1 |
元帅 | 1 |
宰相 | 1 |
皇帝 | 1 |
谋士 | 1 |
霸主 | 2 |
Mongo
> db.hero.aggregate([{$group:{_id:"$position",count:{$sum:1}}}]){ "_id" : "元帅", "count" : 1 }{ "_id" : "皇帝", "count" : 1 }{ "_id" : "霸主", "count" : 2 }{ "_id" : "宰相", "count" : 1 }{ "_id" : "侦察旅旅长", "count" : 1 }{ "_id" : "谋士", "count" : 1 }
分页
Mysql
SELECT * from hero LIMIT 1
id_number | name | gender | position | note |
1 | 朱元璋 | 男 | 皇帝 | 洪武大帝 |
Mongo
> db.hero.aggregate({$limit:1}){ "_id" : ObjectId("60477aced9fd4d508eb534cf"), "name" : "朱元璋", "gender" : "男", "position" : "皇帝", "note" : "洪武 大帝", "id_number" : 1 }
条件过滤
Mysql
SELECT * from hero where position = "霸主"
id_number | name | gender | position | note |
2 | 张士诚 | 男 | 霸主 | 被朱元璋打败 |
3 | 陈友谅 | 男 | 霸主 | 被朱元璋打败 |
Mongo
> db.hero.aggregate({$match:{"position":"霸主"}}){ "_id" : ObjectId("60477e15d9fd4d508eb534d0"), "name" : "张士诚", "gender" : "男", "position" : "霸主", "note" : "被朱 元璋打败", "id_number" : 2 }{ "_id" : ObjectId("60477e15d9fd4d508eb534d1"), "name" : "陈友谅", "gender" : "男", "position" : "霸主", "note" : "被朱 元璋打败", "id_number" : 3 }
复杂实战
Mysql
SELECT position,COUNT(position) from hero where gender = "男" group by position ORDER BY position desc limit 4
position | COUNT(position) |
霸主 | 2 |
谋士 | 1 |
皇帝 | 1 |
宰相 | 1 |
Mongo
> db.hero.aggregate([{$match:{"gender":"男"}},{$group:{_id:"$position",count:{$sum:1}}},{$project:{"position":"$_id","COUNT(position)":"$count",_id:0,"id_number":"$id_number"}},{$sort:{"position":-1}},{$limit:4}]){ "position" : "霸主", "COUNT(position)" : 2 }{ "position" : "谋士", "COUNT(position)" : 1 }{ "position" : "皇帝", "COUNT(position)" : 1 }{ "position" : "宰相", "COUNT(position)" : 1 }
待解决问题
Mysql
SELECT id_number,position,COUNT(position) from hero where gender = "男" group by position ORDER BY position desc limit 4
上面这种sql查询左羊还没搞明白用Mongo如何查询?





