MongoDB——聚合管道之$group操作

Posted 小志的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB——聚合管道之$group操作相关的知识,希望对你有一定的参考价值。

目录

一、聚合管道之$group的概述

  • 按指定的表达式对文档进行分组,并将每个不同分组的文档输出到下一个阶段。输出文档包含一个_id字段,该字段按键包含不同的组。
  • 输出文档还可以包含计算字段,该字段保存由$ group的_id字段分组的一些accumulator表达式的值。$ group不会输出具体的文档而只是统计信息。

二、聚合管道之$group的语法

  • $group的语法格式

     $group:  _id: <expression>, <field1>:  <accumulator1> : <expression1> , ...  
    
  • 语法格式的解释
    (1)、_id字段是必填的;但是可以指定id值为null来为整个输入文档计算累计值。
    (2)、剩余的计算字段是可选的,并使用< accumulator>运算符进行计算。
    (3)、_id和< accumulator>表达式可以接受任何有效的表达式。

三、accumulator操作符

名称描述类比sql
$avg计算均值avg
$first返回每组第一个文档,如果有排序,按照排序,如果没有按照默认的存储的顺序的第一个文档。limit0,1
$last返回每组最后一个文档,如果有排序,按照排序,如果没有按照默认的存储的顺序的最后个文档。-
$max根据分组,获取集合中所有文档对应值得最大值。max
$min根据分组,获取集合中所有文档对应值得最小值。min
$push将指定的表达式的值添加到一个数组中。-
$addToSet将表达式的值添加到一个集合中(无重复值,无序)。-
$sum计算总和sum
$stdDevPop返回输入值的总体标准偏差(population standard deviation)-
$stdDevSamp返回输入值的样本标准偏差(the sample standard deviation)-
  • 注:$ group阶段的内存限制为100M。默认情况下,如果stage超过此限制,$ group将产生错误。但是,要允许处理大型数据集,请将allowDiskUse选项设置为true以启用$group操作以写入临时文件。

四、聚合管道之$group的示例

4.1、数据准备

  • 准备数据集,执行脚本

    var tags = ["nosql","mongodb","document","developer","popular"];
    var types = ["technology","sociality","travel","novel","literature"];
    var books=[];
    for(var i=0;i<50;i++)
    	var typeIdx = Math.floor(Math.random()*types.length);
    	var tagIdx = Math.floor(Math.random()*tags.length);
    	var tagIdx2 = Math.floor(Math.random()*tags.length);
    	var favCount = Math.floor(Math.random()*100);
    	var username = "xx00"+Math.floor(Math.random()*10);
    	var age = 20 + Math.floor(Math.random()*15);
    	var book = 
    		title: "book-"+i, 
    		type: types[typeIdx],
    		tag: [tags[tagIdx],tags[tagIdx2]],
    		favCount: favCount, 
    		author: name:username,age:age
    	;
    	books.push(book)
    
    db.books1.insertMany(books);
    
  • 查询books1集合中的数据

    > db.books1.find()
    

4.2、统计books1集合中的数量、收藏总数和平均值

  • 统计book的数量、收藏总数和平均值

    db.books1.aggregate([ 
    $group:_id:null,count:$sum:1,popCount:$sum:"$favCount",avgValue: $avg:"$favCount" 
    ])
    

  • 解释

4.3、统计books1集合中每个作者的book收藏总数

  • 统计每个作者的book收藏总数

    db.books1.aggregate([ 
    	$group:_id:"$author.name",pop:$sum:"$favCount" 
    ])
    

  • 解释

4.4、统计books1集合中每个作者的每本book的收藏数

  • 统计每个作者的每本book的收藏数

    db.books1.aggregate([ 
    $group:_id:name:"$author.name",title:"$title",pop:$sum:"$favCount" 
    ])
    

  • 解释

4.5、统计books1集合中每个作者的book的type合集

  • 统计每个作者的book的type合集

    db.books1.aggregate([ 
    $group:_id:"$author.name",types:$addToSet:"$type" 
    ])
    

  • 解释

以上是关于MongoDB——聚合管道之$group操作的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB的聚合操作

mongodb3 之单一用途聚合

Mongodb中数据聚合之聚合管道aggregate

在 MongoDB 的聚合管道中获取 $group 之后的输入文档中的字段

在 MongoDB 的聚合管道中获取 $group 之后的输入文档中的字段

MongoDB的聚合操作