`

MongoDB-基础-05-聚合

阅读更多

出处:http://www.cnblogs.com/stephen-liu74/archive/2012/09/19/2652308.html

 

MongoDB除了基本的查询功能之外,还提供了强大的聚合功能。这里主要介绍count、distinct和group。

 

1. count:

    --在空集合中,count返回的数量为0。

    > db.test.count()

    0

    --测试插入一个文档后count的返回值。

    > db.test.insert({"test":1})

    > db.test.count()

    1

    > db.test.insert({"test":2})

    > db.test.count()

    2

    --count和find一样,也接受条件。从结果可以看出,只有符合条件的文档参与了计算。

    > db.test.count({"test":1})

    1

     

2. distinct:

    distinct用来找出给定键的所有不同的值。使用时也必须指定集合和键。

    --为了便于后面的测试,先清空测试集合。

    > db.test.remove()

    > db.test.count()

    0

    --插入4条测试数据。请留意Age字段。

    > db.test.insert({"name":"Ada", "age":20})

    > db.test.insert({"name":"Fred", "age":35})

    > db.test.insert({"name":"Andy", "age":35})

    > db.test.insert({"name":"Susan", "age":60})

    --distinct命令必须指定集合名称,如test,以及需要区分的字段,如:age。

    --下面的命令将基于test集合中的age字段执行distinct命令。

    > db.runCommand({"distinct":"test", "key":"age"})

    {

            "values" : [

                    20,

                    35,

                    60

            ],

            "stats" : {

                    "n" : 4,

                    "nscanned" : 4,

                    "nscannedObjects" : 4,

                    "timems" : 0,

                    "cursor" : "BasicCursor"

            },

            "ok" : 1

    }    

 

3. group:

    group做的聚合有些复杂。先选定分组所依据的键,此后MongoDB就会将集合依据选定键值的不同分成若干组。然后可以通过聚合每一组内的文档,产生一个结果文档。

    --这里是准备的测试数据

    > db.test.remove()

    > db.test.insert({"day" : "2012-08-20", "time" : "2012-08-20 03:20:40", "price" : 4.23})

    > db.test.insert({"day" : "2012-08-21", "time" : "2012-08-21 11:28:00", "price" : 4.27})

    > db.test.insert({"day" : "2012-08-20", "time" : "2012-08-20 05:00:00", "price" : 4.10})

    > db.test.insert({"day" : "2012-08-22", "time" : "2012-08-22 05:26:00", "price" : 4.30})

    > db.test.insert({"day" : "2012-08-21", "time" : "2012-08-21 08:34:00", "price" : 4.01})

    --这里将用day作为group的分组键,然后取出time键值为最新时间戳的文档,同时也取出该文档的price键值。

    > db.test.group( {

    ... "key" : {"day":true},           --如果是多个字段,可以为{"f1":true,"f2":true}

    ... "initial" : {"time" : "0"},       --initial表示$reduce函数参数prev的初始值。每个组都有一份该初始值。

    ... "$reduce" : function(doc,prev) {  --reduce函数接受两个参数,doc表示正在迭代的当前文档,prev表示累加器文档。

    ...     if (doc.time > prev.time) {

    ...         prev.day = doc.day

    ...         prev.price = doc.price;

    ...         prev.time = doc.time;

    ...     }

    ... } } )

    [

        {

            "day" : "2012-08-20",

            "time" : "2012-08-20 05:00:00",

            "price" : 4.1

        },

        {

            "day" : "2012-08-21",

            "time" : "2012-08-21 11:28:00",

            "price" : 4.27

        },

        {

            "day" : "2012-08-22",

            "time" : "2012-08-22 05:26:00",

            "price" : 4.3

        }

    ]

    --下面的例子是统计每个分组内文档的数量。

    > db.test.group( {

    ... key: { day: true},

    ... initial: {count: 0},

    ... reduce: function(obj,prev){ prev.count++;},

    ... } )

    [

        {

            "day" : "2012-08-20",

            "count" : 2

        },

        {

            "day" : "2012-08-21",

            "count" : 2

        },

        {

            "day" : "2012-08-22",

            "count" : 1

        }

    ]

    --最后一个是通过完成器修改reduce结果的例子。

    > db.test.group( {

    ... key: { day: true},

    ... initial: {count: 0},

    ... reduce: function(obj,prev){ prev.count++;},

    ... finalize: function(out){ out.scaledCount = out.count * 10 } --在结果文档中新增一个键。

    ... } )

    [

        {

            "day" : "2012-08-20",

            "count" : 2,

            "scaledCount" : 20

        },

        {

            "day" : "2012-08-21",

            "count" : 2,

            "scaledCount" : 20

        },

        {

            "day" : "2012-08-22",

            "count" : 1,

            "scaledCount" : 10

        }    

    ]

 

分享到:
评论

相关推荐

    practical-mongodb-aggregations-book:实用的MongoDB汇总书

    Paul Done为《实用MongoDB聚合》一书创建和组装内容的主要仓库。 该书的发行版本可在以下获得: 本书的内容是作为一组Markdown文件编写的,然后将其生成为一组静态HTML / PNG / CSS / JS文件,这些文件可以通过...

    分布式数据库MongoDB视频教程.zip

    01.MongoDB基础 视频 01-复习_recv 02-简介_recv 03-增、改、删_recv 04-查询_recv 05-查询2_recv 06-查询3_recv 07-聚合-分组_recv 08-聚合-筛选、排序、分页_recv 09-聚合-拆分数组_recv 资料 02.MongoDB高级 视频...

    mongodb-aggregation-framework

    内容MongoDB聚合基础汇总介绍管道的概念聚合结构和语法$ match:过滤文档使用$ project 使用表达式光标式方法阶段$ group阶段$放开$ lookup阶段利用MongoDB的灵活架构mongoimport 模式的重要性探索模式迁移架构观看...

    MongoDB-Fundamentals:在现代云计算环境中学习实用的MongoDB技能

    MongoDB基础知识 这是发布的的存储库。 它包含从头到尾完成该课程所必需的所有支持项目文件。 要求和设置 要开始使用项目文件,您需要: 安装 安装 安装 关于MongoDB基础知识 将帮助您开始使用MongoDB在云计算...

    MongoDB基础

    自己整理的MongoDB相关的基础内容,主要涉及到数据库操作、集合操作、索引、聚合等内容

    基于Morphia实现MongoDB按小时、按天聚合操作方法

    最近接到需求,需要对用户账户下的设备状态,分别按照天以及小时进行聚合,以此为基础绘制设备状态趋势图. 实现思路是启动定时任务,对各用户的设备状态数据分别按照小时以及天进行聚合,并存储进数据库中供用户后续...

    MongoDB_Golang.zip

    基于Mgo,Mongo-go-driver这两个比较常用的MongoDB基础库,做了连接池初始化,model层服务封装,提供:初始化MongoDB连接池复用, MongoDB集合(类似MySQL的数据表)的增、删、改、查,事务、管道操作、聚合操作、...

    springMongodb参考文档中文版

    自定义基础存储库 7.7。从聚合根发布事件 7.8。Spring数据扩展 7.8.1。Querydsl扩展 7.8.2。Web支持 7.8.3。存储库填充程序 7.8.4。传统网络支持 参考文档 8.介绍 8.1。文档结构 9. MongoDB支持 9.1。入门 9.2。示例...

    MongoDB入门笔记

    用MindMaster以脑图形式,记录对MongoDB的简单操作和基础了解,适合完全不了解MongoDB的人想快速的了解下面几个问题: 1.MongoDB是什么? 2.安装MongoDB 3.MongoDB对文档的增删改查、索引、聚合 4.用Java操作MongoDB...

    MongoDB权威指南(中文版)高清

    1098.1.3 停止MongoDB 1108.2 监控 1108.2.1 使用管理接口 1108.2.2 serverStatus 1128.2.3 mongostat 1138.2.4 第三方插件 1138.3 安全和认证 1148.3.1 认证的基础知识 1148.3.2 认证的工作原理 ...

    电子书:MongoDB权威指南(中文版)

    1078.1.2 配置文件 1098.1.3 停止MongoDB 1108.2 监控 1108.2.1 使用管理接口 1108.2.2 serverStatus 1128.2.3 mongostat 1138.2.4 第三方插件 1138.3 安全和认证 1148.3.1 认证的基础知识 1148.3...

    MongoDB基础及项目案例源码讲解

    1、本课程结合实际C/C++项目案例以实战为主,从MongoDB开发环境的安装配置到基础常用的操作、大尺寸文件GridFS的存储、排序、索引、聚合、在多线程中使用以及基于MongoDB的考试系统项目,所有功能均有源代码和文档...

    Spring Cloud Finchley SR2全套(集成Spring Gateway)

    ├───────mongodb-file-service────────Mongodb文件服务模块[11010] ├───────redis-delay-service─────────延迟消费服务模块[11020] ├──cloud-modules-web──────────...

    kubernetes-mongoose:使用Mongoose for MongoDB和Express for API创建Node.js地图服务器应用程序

    用户通过其API与已部署的应用进行交互包含的组件:具有强大的索引和查询,聚合以及广泛的驱动程序支持的MongoDB已经成为许多初创企业和企业的首选JSON数据存储。 :创建和管理您自己的云基础架构,并将Kubernetes...

    数据分析师课件培训完整笔记HTML文本格式

    数据分析师课件]2-1python基础知识.html 数据分析师课件]2-4基于 HTML的爬虫,Python (Beautifulsoup) 实现html 数据分析师课件]2-5网络爬虫高级技巧: 使用代理和反爬虫机制.html [数据分析师课件]2-6 应用案例: ...

    轻量级JAVA实时业务风控系统框架.zip

    mongodb本身的聚合函数统计维度,支持很多比如:max,min,sum,avg,first,last,标准差,采样标准差,复杂的统计方法可以在基础聚合函数上建立,比如行为习惯: getDB().getCollection(collectionName)....

    IoTDashboard:使用Javascript(d3.js),Python(Django)和mongoDB可视化物联网中的数据流

    物联网基础设施由传感器,低能耗网络,网关,收集信息的服务器和数据库组成。 这些元素的最后两个通常位于云中。 基础设施的作用是收集,存储和处理传感器数据流。 主要挑战包括处理大量数据,从中提取见解。 为了...

    网络架构师148讲视频课程

    │ 第05节:TortoiseGit的本地使用.avi │ 第06节:Egit的本地使用.avi │ 第07节:远程使用以及冲突解决.avi │ 第08节:基本业务功能和数据字典.avi │ 第09节:搭建基础的开发环境.avi │ 第10节:Spring+Mybatis...

    beeva-best-practices:BEEVA中的最佳做法和样式指南

    基础设施管理 吉特 前端 Angular.js HTML5 Java脚本 CSS和样式 前端工具生态系统 聚合物 灰烬 IT安全与加固 服务器安全性 安全发展 ### NoSQL MongoDB的 质量保证 ATDD验收测试驱动的开发 蠡 代码设计 代码...

    musomap:全球音乐人地图

    穆索地图音乐家的全球地图。版本 2.0.0 在线近 2 年后,我正在重建 musomap。 一个更灵活的工作环境来开发新想法和发布改进。...基础设施NodeJS (Express) MongoDB工具基因运动罗博蒙戈伙伴天蓝色蒙古实验室参考

Global site tag (gtag.js) - Google Analytics