zoukankan      html  css  js  c++  java
  • mongodb学习之:聚合

    @font-face { font-family: "Times New Roman"; }@font-face { font-family: "宋体"; }p.MsoNormal { margin: 0pt 0pt 0.0001pt; text-align: justify; font-family: "Times New Roman"; font-size: 10.5pt; }p.p { margin: 5pt 0pt; text-align: left; font-family: "Times New Roman"; font-size: 12pt; }span.msoIns { text-decoration: underline; color: blue; }span.msoDel { text-decoration: line-through; color: red; }div.Section0 { }

    Mongodb除了基本的查询功能,还提供了强大的聚合工具。这一章来看下如何使用聚合进行查询

    count:

    count是最基本的聚合工具,返回集合中的文档数量:

    > db.student_infor.count()

    10

    还可以设置条件进行查询

    > db.student_infor.count({"age":{$gt:19}})

    6

    distinct:

    distinct用来找出制定键的所有不同的值,在使用的时候必须指定集合和键

    distinct对应的就是集合名字,key对应的是键。输出结果是student_infor中的age所有的值

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

    { "values" : [ 21, 19, 20, 22, 18 ], "ok" : 1 }

    group:

    Group大约需要一下几个参数。


     1.key:用来分组文档的字段。和keyf两者必须有一个
     2.keyf:可以接受一个javascript函数。用来动态的确定分组文档的字段。和key两者必须有一个
     3.initialreduce中使用变量的初始化
     4.reduce:执行的reduce函数。函数需要返回值。
     5.cond:执行过滤的条件。
     6.finallize:在reduce执行完成,结果集返回之前对结果集最终执行的函数。可选的。

    来看一个具体的例子:

    >db.student_infor.group({"key":{age:true},"initial":{num:0},$reduce:function(doc,prev){prev.num++}})

    key:age代表用age来做分组。指定为true那么相同的age将会被分成一组。

    initial是指定了一个初始的值,将会在reduce中使用

    reduce:每个文档都对应一次这个调用,系统传递两个参数:当前文档和累加器文档。doc代表当前正在迭代的文档,prev就是累加器文档,用来进行各种统计的累加。prev中用到的num就是在intial中初始的值

    上面的执行结果如下:统计出了每个年龄的学生个数

    [

    {

    "age" : 21,

    "num" : 2

    },

    {

    "age" : 19,

    "num" : 1

    },

    {

    "age" : 20,

    "num" : 2

    },

    {

    "age" : 22,

    "num" : 2

    },

    {

    "age" : 18,

    "num" : 3

    }

    ]

    对于查询我们还可以使用条件判断进行筛选,方法则是采用condtion

    > db.student_infor.group({"key":{age:true},"initial":{num:0},$reduce:function(doc,prev){prev.num++},condition:{"age":{$gt:20}}})

    得到age大于20的分组查询情况。

    [ { "age" : 21, "num" : 2 }, { "age" : 22, "num" : 2 } ]

    还有另外一种写法:

    > db.runCommand({group:{ns:"student_infor",key:{age:true},initial:{num:0},$reduce:function(doc,prev){prev.num++}}})

    这里添加了一个ns参数,后面跟的是集合的名字。

    aggregate:

    MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果。有点类似sql语句中的 count(*)

    下表展示了一些聚合的表达式:

    表达式

    描述

    实例

    $sum

    计算总和。

    db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])

    $avg

    计算平均值

    db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])

    $min

    获取集合中所有文档对应值得最小值。

    db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])

    $max

    获取集合中所有文档对应值得最大值。

    db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])

    $push

    在结果文档中插入值到一个数组中。

    db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])

    $addToSet

    在结果文档中插入值到一个数组中,但不创建副本。

    db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])

    $first

    根据资源文档的排序获取第一个文档数据。

    db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])

    $last

    根据资源文档的排序获取最后一个文档数据

    db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])

    来看一个具体的例子:group代表分组,id代表分组的依据,average是新一个新生成的字段。$avg是平均的功能,”$age”代表是对age进行平均

    >db.student_infor.aggregate({$group:{_id:"student_id",average:{$avg:"$age"}}})

    { "_id" : "student_id", "average" : 19.9 }

    找到age最大的

    >db.student_infor.aggregate({$group:{_id:"age",average:{$max:"$age"}}})

    { "_id" : "age", "average" : 22 }

    找到age小的

    > db.student_infor.aggregate({$group:{_id:"age",average:{$min:"$age"}}})

    { "_id" : "age", "average" : 18 }

    age字段插入到数组中

    > db.student_infor.aggregate({$group:{_id:"age",average:{$push:"$age"}}})

    { "_id" : "age", "average" : [ 21, 19, 20, 22, 18, 18, 22, 21, 20, 18 ] }

    age进行求和

    > db.student_infor.aggregate({$group:{_id:"age",average:{$sum:"$age"}}})

    { "_id" : "age", "average" : 199 }

  • 相关阅读:
    《应用Yii1.1和PHP5进行敏捷Web开发》学习笔记(转)
    YII 小模块功能
    Netbeans代码配色主题大搜集
    opensuse 启动巨慢 解决方法 90s多
    opensuse 安装 网易云音乐 rpm netease music
    linux qq rpm deb opensuse
    openSUSE 安装 alien
    第一行代码 Android 第2版
    Android Studio AVD 虚拟机 联网 失败
    docker error during connect: Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.29/containers/json: open //./pipe/docker_engine: The system cannot find the file specified. In the default daemon configuratio
  • 原文地址:https://www.cnblogs.com/zhanghongfeng/p/8099274.html
Copyright © 2011-2022 走看看