[教程]MongoDB 从入门到进阶 (aggregation数据库状态)
下载地址: http://www.wojilu.com/Forum1/Topic/4601
GitHub: https://github.com/magicdict/MagicMongoDBTool
在开始介绍这节之前,我来说说我开发这个工具的意义。
我不敢保证以后MongoDB可以大红大紫,也无法保证MongoDB以后会分享很多很多市场份额。
现在开发这个东西,一年后可能Mongo倒闭了,这个工具就是一个垃圾。一年后,Mongo修成正果,这个工具就是香饽饽。
等所有人都觉得这个东西会火,你才去关注,开发工具,就晚了。花点业余时间,开发Mongo工具的同时,最主要去学习一下大数据的一些思想,例如副本,分片概念。
还有就是阶层数据库的一些实现的方法。当然,由于3年前才开始从VB.NET转C#的,也希望通过多些编码将C#用身体记住。
[aggregation Framework]
例子1
http://docs.mongodb.org/manual/reference/aggregation/
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
http://dotnet.dzone.com/articles/mongodb-aggregation-framework
下面是例子的测试数据
{ "_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
关于操作符号: http://docs.mongodb.org/manual/reference/aggregation/#comparison-operators
3 $Group
我们对于User进行Group操作,并且对于Count进行合计
注意,这里必须要有一个_id字段来表示Group的条件
{ $group : { _id : { "MyUser": "$User" } TotalCount : { $sum : "$Count" } } }
结果就是Mary的合计值是8,Tom则是6.
Select User As MyUser SUM(Count) AS TotalCount from table group 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 MyUser SUM(Count) AS TotalCount from table group by User,Country
最后,可以将match,group,project一起使用
Select User As MyUser SUM(Count) AS TotalCount from table group by User,Country Where 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 MyUser SUM(Count) AS TotalCount from table group by User,Country Order by TotalCount
【Mongo的数据库状态】
连接Connection状态
数据库状态
数据集状态