zoukankan      html  css  js  c++  java
  • [教程]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状态

       

         数据库状态

        

    数据集状态

  • 相关阅读:
    uip UDPclient模式通信移植,p本地ort可以是无规
    正则表达式摘要
    Regular expression
    正则-合乎规则
    通配符-通配
    正则表达式总结
    判断大盘筑顶的方法
    筑顶和下跌规律
    股票的筑顶危险信号
    股票筑顶的基本特征
  • 原文地址:https://www.cnblogs.com/TextEditor/p/2857999.html
Copyright © 2011-2022 走看看