最近一直在用mongodb,有时候会需要用到统计,在网上查了一些资料,最适合用的就是用aggregate,以下介绍一下自己运用的心得。。

别人写过的我就不过多描述了,大家一搜能搜索到N多一样的,我写一下我的总结。

基础知识

请大家自行查找更多,以下是关键文档。

操作符介绍:

$project:包含、排除、重命名和显示字段

$match:查询,需要同find()一样的参数

$limit:限制结果数量

$skip:忽略结果的数量

$sort:按照给定的字段排序结果

$group:按照给定表达式组合结果

$unwind:分割嵌入数组到自己顶层文件

文档:MongoDB 官方aggregate说明

相关使用:

db.collection.aggregate([array]);

array可是是任何一个或多个操作符。

group和match的用法,使用过sqlserver,group的用法很好理解,根据指定列进行分组统计,可以统计分组的数量,也能统计分组中的和或者平均值等。

group之前的match,是对源数据进行查询,group之后的match是对group之后的数据进行筛选;

同理,sort,skip,limit也是同样的原理;

 {_id:1,name:"a",status:1,num:1}
{_id:2,name:"a",status:0,num:2}
{_id:3,name:"b",status:1,num:3}
{_id:4,name:"c",status:1,num:4}
{_id:5,name:"d",status:1,num:5}

以下是示例:

应用一:统计name的数量和总数;

db.collection.aggregate([

  {$group:{_id:"$name",count:{$sum:1},total:{$sum:"$num"}}

]);

应用二:统计status=1的name的数量;

db.collection.aggregate([

  {$match:{status:1}},

  {$group:{_id:"$name",count:{$sum:1}}}

]);

应用三:统计name的数量,并且数量为小于2的;

db.collection.aggregate([

  {$group:{_id:"$name",count:{$sum:1}},

  {$match:{count:{$lt:2}}}

]);

应用四:统计stauts=1的name的数量,并且数量为1的;

db.collection.aggregate([

  {$match:{status:1}},

  {$group:{_id:"$name",count:{$sum:1}}},

  {$match:{count:1}}

]);

多列group,根据name和status进行多列

db.collection.aggregate([

  {$group:{_id:{name:"$name",st:"$status"},count:{$sum:1}}}

]);

$project该操作符很简单,

db.collection.aggregate([

  {$project:{name:1,status:1}}

]);

结果是,只有_id,name,status三个字段的表数据,相当于sql表达式 select _id,name,status from collection

$unwind

这个操作符可以将一个数组的文档拆分为多条文档,在特殊条件下有用,本人暂没有进行过多的研究。

以上基本就可以实现大部分统计了,group前条件,group后条件,是重点。

MongoDB aggregate 运用篇 个人总结的更多相关文章

  1. MongoDB aggregate 运用篇

    基础知识 操作符介绍: $project:包含.排除.重命名和显示字段 $match:查询,需要同find()一样的参数 $limit:限制结果数量 $skip:忽略结果的数量 $sort:按照给定的 ...

  2. MongoDB aggregate 运用篇(转)

    http://www.cnblogs.com/qq78292959/p/4440679.html 最近一直在用mongodb,有时候会需要用到统计,在网上查了一些资料,最适合用的就是用aggregat ...

  3. MongoDB【第一篇】MongodDB初识

    NoSQL介绍 一.NoSQL简介 NoSQL,全称是”Not Only Sql”,指的是非关系型的数据库. 非关系型数据库主要有这些特点:非关系型的.分布式的.开源的.水平可扩展的. 原始的目的是为 ...

  4. MongoDB【第二篇】集群搭建

    第一步:准备 1.安装包 mongodb-linux-x86_64-rhel70-3.4.2.tgz 2. 架构: 本文为 1-primary.1-secondary.1-arbiter 的 mong ...

  5. MongoDB【第二篇】MongoDB逻辑与物理存储结构

    基本的操作 一.常用的命令和基础知识 1.进入MongoDB sehll 首先我们进入到MongoDB所在目录执行 cd /work/app/mongodb/bin/ #启动 ./mongo 为了方便 ...

  6. MongoDB Aggregate Methods(2) MonoDB 的 3 种聚合函数

    aggregate(pipeline,options) 指定 group 的 keys, 通过操作符 $push/$addToSet/$sum 等实现简单的 reduce, 不支持函数/自定义变量 g ...

  7. 【mongoDB运维篇④】Shard 分片集群

    简述 为何要分片 减少单机请求数,降低单机负载,提高总负载 减少单机的存储空间,提高总存空间. 常见的mongodb sharding 服务器架构 要构建一个 MongoDB Sharding Clu ...

  8. MongoDB基础一篇就够了

    MongoDB linux安装MongoDB Windows安装MongoDB 查看当前数据库名称 db 查看所有数据库名称 列出所有在物理上存在的数据库 show dbs 切换数据库 如果数据库不存 ...

  9. nodejs笔记--与MongoDB的交互篇(七)

    原文地址:http://www.cnblogs.com/zhongweiv/p/node_mongodb.html 目录 简介 MongoDB安装(windows) MongoDB基本语法和操作入门( ...

随机推荐

  1. 瘋耔java语言笔记

    一◐ java概述                                                                                        1.1 ...

  2. EF之结构进一步优化

    针对之前的使用,做了进一步优化 1.将DAL对象缓存起来 2.仓储类不依赖固定构造的DbContext,执行操作的时候,从线程中动态读取DbContext,这一步也是为了方便将DAL对象缓存起来,解决 ...

  3. 从零开始学习Android(二)从架构开始说起

    我们刚开始学新东西的时候,往往希望能从一个实例进行入手学习.接下来的系列连载文章也主要是围绕这个实例进行.这个实例原形是从电子书<Android应用开发详解>得到的,我们在这里对其进行详细 ...

  4. R语言多项式回归

    含有x和y这两个变量的线性回归是所有回归分析中最常见的一种:而且,在描述它们关系的时候,也是最有效.最容易假设的一种模型.然而,有些时候,它的实际情况下某些潜在的关系是非常复杂的,不是二元分析所能解决 ...

  5. Hbase的配置和安装

    Hbase的配置和安装 1. 解压hbase.配置HBASE_HOME tar -zxvf hbase-1.2.4.tar.gz 2. 修改$HBASE_HOME/conf/hbase-env.sh文 ...

  6. validate插件深入学习-04自定义验证方法

    自定义验证方法 jQuery.validator.addMethod(name,method,[,message]) name: 方法名 method: function(value,element, ...

  7. Linux系统下配置JDK环境变量

    刚申请了阿里云,平时很少接触Linux,特此记录一下Linux系统下安装JDK的步骤. 1.进入usr:cd /usr: 2.创建java文件夹:mkdir java: 3.将下载好的文件拷贝至jav ...

  8. fonts.googleapis.com 加载慢的解决方法

    把:fonts.googleapis.com 替换成 fonts.useso.com

  9. (原创)Linux跟Window共享文件的两个简单方法

    第一中种方法: Linux中启动shell,输入如下命令: mount -t cifs -o username="my-pc-name",password="my-pas ...

  10. js判断中文

    var reg = /^[\u4E00-\u9FA5]+$/;if(!reg.test(keywordscn)){ alert('请填写中文') return false;}