[教程]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状态

   

     数据库状态

    

数据集状态

posted @ 2013-01-20 15:33  灰毛毛  阅读(10174)  评论(5编辑  收藏  举报