之前一直介绍的是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