• 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 }

  • 相关阅读:
    6、深入理解计算机系统笔记:存储器层次结构,存储技术(1)
    流程图【占无内容】
    程序的三种基本控制架构【只有提纲】
    Console算法[for]穷举法:百钱买百鸡
    Logic算法(狼羊白菜)
    Console算法continue与break的区别?
    Console算法[for]简单画图
    Console算法[for]输出等腰三角形
    Console算法[for]国王与老人的六十四格
    Console算法[for]素数
  • 原文地址:https://www.cnblogs.com/zhanghongfeng/p/8099274.html
Copyright © 2020-2023  润新知