Mongo学习之旅(四,聚合查询)

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容