博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[教程]MongoDB 从入门到进阶 (aggregation数据库状态)
阅读量:7080 次
发布时间:2019-06-28

本文共 3882 字,大约阅读时间需要 12 分钟。

    下载地址:

     GitHub:  

     在开始介绍这节之前,我来说说我开发这个工具的意义。

     我不敢保证以后MongoDB可以大红大紫,也无法保证MongoDB以后会分享很多很多市场份额。

     现在开发这个东西,一年后可能Mongo倒闭了,这个工具就是一个垃圾。一年后,Mongo修成正果,这个工具就是香饽饽。

     等所有人都觉得这个东西会火,你才去关注,开发工具,就晚了。花点业余时间,开发Mongo工具的同时,最主要去学习一下大数据的一些思想,例如副本,分片概念。

     还有就是阶层数据库的一些实现的方法。当然,由于3年前才开始从VB.NET转C#的,也希望通过多些编码将C#用身体记住。

[aggregation Framework]

例子1

aggregation Framework 是MongoDB的一个功能强大的统计框架,这里就演示一下这个框架的使用方法。

首先,我们新建一个aggregation数据集。然后再按照官方文档的样子,使用MongoCola插入一个文档。(将下面这段JSON直接粘贴到新建文档的窗体里面就可以了)

{  title : "this is my title" ,  author : "bob" ,  posted : new Date() ,  pageViews : 5 ,  tags : [ "fun" , "good" , "fun" ] ,  comments : [      { author :"joe" , text : "this is cool" } ,      { author :"sam" , text : "this is bad" }  ],  other : { foo : 5 }}

 

1.$project

这个操作符号,可以用来做Select 的操作。用来指定显示的列。

{ $project : {        title : 1 ,        author : 1     }}

这里表示我们只是需要title和author列的信息。

这里的参数1:表示 0:非表示。 _id是一个默认的表示项目,我们可以通过将_id设置为0,告诉系统不表示这个项目。

{ $project : {        _id : 0 ,        title : 1 ,        author : 1    }}

当然,你也可以新建一个字段,例如一个doctoredPageViews字段,这个字段是在原有字段的基础上加工而成的值。

就如 SQL中的,Select (pageViews + 10 As doctoredPageViews) from table

{ $project : {        title : 1,        doctoredPageViews : { $add:["$pageViews", 10] }    }}

 当然你也可以重新命名列名

{ $project : {        title : 1 ,        page_views : "$pageViews" ,        bar : "$other.foo"    }}

最后你也可以通过Project操作符,来构建你想要的文档结果。下面这个例子里面的Status就是一个新建的子文档

{ $project : {        title : 1 ,        stats : {            pv : "$pageViews",            foo : "$other.foo",            dpv : { $add:["$pageViews", 10] }        }    }}

2$match 这个操作符号,有点类似于Select文的Where条件。 例如我们想寻找author是bob的记录:
{ $match : { author : "bob" } }

这个Aggregate框架里面的各种操作符号是可以任意组合的。我们可以既有match操作,又有project操作。

这里我们用工具将两种操作的条件分别加上。

注意:这里我们已经添加了2个条件了。第一个是match,第二个是project。

 

例子2

下面是例子的测试数据

{ "_id" : "1", "User" : "Tom", "Country" : "Finland", "Count" : 1 }{ "_id" : "2", "User" : "Tom", "Country" : "Finland", "Count" : 3 }{ "_id" : "3", "User" : "Tom", "Country" : "Finland", "Count" : 2 }{ "_id" : "4", "User" : "Mary", "Country" : "Sweden", "Count" : 1 }{ "_id" : "5", "User" : "Mary", "Country" : "Sweden", "Count" : 7 }

 

我们找一下是User是Tom,Count >= 2 的记录

{ $match : {      User: "Tom",     Count:{
"$gte": 2} } }

4

关于操作符号: 

3 $Group

我们对于User进行Group操作,并且对于Count进行合计

注意,这里必须要有一个_id字段来表示Group的条件

{ $group : {        _id : { "MyUser": "$User" }       TotalCount : { $sum : "$Count" }       }}

结果就是Mary的合计值是8,Tom则是6.

Select User As MyUserSUM(Count) AS TotalCountfrom tablegroup by User

 

我们再次添加一条记录

{ "_id" : "1", "User" : "Tom", "Country" : "Finland", "Count" : 1 }{ "_id" : "2", "User" : "Tom", "Country" : "Finland", "Count" : 3 }{ "_id" : "3", "User" : "Tom", "Country" : "Finland", "Count" : 2 }{ "_id" : "4", "User" : "Mary", "Country" : "Sweden", "Count" : 1 }{ "_id" : "5", "User" : "Mary", "Country" : "Sweden", "Count" : 7 }{ "_id" : "6", "User" : "Tom", "Country" : "England", "Count" : 3 }

我们按照User和Country来做GroupBY

{ $group : {        _id : { "MyUser": "$User" ,                  "Country":"$Country"                   },       TotalCount : { $sum : "$Count" }       } }

 

Select User As MyUserSUM(Count) AS TotalCountfrom tablegroup by User,Country

 

最后,可以将match,group,project一起使用

Select User As MyUserSUM(Count) AS TotalCountfrom tablegroup by User,CountryWhere User = ‘Tom’ And Count >= 2

注意:这里有一个管道的概念,前一个操作的结果,作为后一个操作的源头。例如这里Match结果,就是下一个group的操作源头。

4$Sort

对于结果,我们还可以进行Sort操作。

{ $group : {        _id : { "MyUser": "$User" ,                  "Country":"$Country"                   },       TotalCount : { $sum : "$Count" }       }}

上面这段是对于User和Country的分组Group操作。我们如果需要按照TotalCount排序的话,只需要在这个结果之后,增加Sort操作。

由于管道的缘故,Sort的操作源头就是前面的Group结果

{ $sort : {        TotalCount:1       }}

Select User As MyUserSUM(Count) AS TotalCountfrom tablegroup by User,CountryOrder by TotalCount

 

 【Mongo的数据库状态】

     连接Connection状态

   

     数据库状态

    

数据集状态

转载于:https://www.cnblogs.com/TextEditor/archive/2013/01/20/2857999.html

你可能感兴趣的文章
.NET Core中的去虚
查看>>
REST是否会步SOAP的后尘?
查看>>
微服务意味着分布式系统
查看>>
前端大神用React刻了一个Windows XP
查看>>
10种避免大型部署的方法
查看>>
Yelp的实时流技术之二:将MySQL表数据变更实时流到Kafka中
查看>>
数据不可变之linked-in/rocketdata
查看>>
Java 10新特性前瞻
查看>>
从蚂蚁金服实践入手,带你深入了解 Service Mesh
查看>>
通过DevOps考古学了解生产环境
查看>>
nginx lua指令执行顺序
查看>>
新书问答:Agile Management
查看>>
精益企业中架构师的角色
查看>>
angular-cli创建angular2项目并添加ng2-bootstrap
查看>>
leetcode讲解之开篇--刷题技巧
查看>>
Ruby 2.5.0概览
查看>>
改变从内部开始:开发者与管理者的协作
查看>>
mac使用minikube安装kubernetes
查看>>
Chrome开发者工具中关于“Deferred long-running timer task(s) ”的警告
查看>>
聊聊跨域
查看>>