之前一直介绍的是Mongo的简单查询,在真实的业务中,我们可能会设计到各种的聚合查询,接下来我们简单的介绍以下Mongo中的聚合查询,之后会涉及到Mongo中的一些脚本介绍。
聚合查询
在以往的系型数据库中,聚合查询可能是这样子的
SELECT ID FROM USER GROUP ID
但是在Mongo中我们将用到的是aggregate()方法,aggregate方法的基本语法格式如下
db.collection_name.aggregate(AGGREGATE_OPERATION)
下面我将通过一个简单的例子来展示aggregate方法的使用.
准备数据
准备一个study_book集合,插入一下数据:
db.study_book.insertMany([{
_id: ObjectId("7df78ad8902c"),
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by_user: 'runoob.com',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
},
{
_id: ObjectId("7df78ad8902d"),
title: 'NoSQL Overview',
description: 'No sql database is very fast',
by_user: 'runoob.com',
url: 'http://www.runoob.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 10
},
{
_id: ObjectId("7df78ad8902e"),
title: 'Neo4j Overview',
description: 'Neo4j is no sql database',
by_user: 'Neo4j',
url: 'http://www.neo4j.com',
tags: ['neo4j', 'database', 'NoSQL'],
likes: 750
}])
查询
接下来我们通过aggregate方法统计每个作者写的文章数量
db.study_book.aggregate({
$group: {
_id: "$by_user",
counts: {$sum: 1}
}
})
以上语句类似与
select by_user, count(*) from study_book group by by_user
执行结果为:
image.png
解释:Mongo中聚合是通过管道的形式来定义的,一个管道包含了多个处理阶段。上面的命令仅涉及group的操作。
下面展示多个阶段操作:
管道
db.study_book.aggregate([
{$group: { _id: "$by_user", counts: {$sum: 1}}},
{$sort: {counts : -1}}
])
该语句执行结果如下:
image.png
上面的命令涉及到了两个阶段(stage) ----group(分组)和sort(排序),其中:
- group阶段实现了按指定字段(by_user)的分组计算,sum:1表示按每个文档累计1进行统计。
- sort阶段在分组之后,按照分组计算的结果输出,并负责完成排序。
更多操作可以参考下面这张表格:
Mongo中的聚合表达式:
image.png
参考
https://www.runoob.com/mongodb/mongodb-aggregate.html
https://weread.qq.com/web/reader/f1232340724708a1f128522