当前位置: 首页 > news >正文

MongoDB aggregate 运用篇(转)

  • 最近一直在用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也是同样的原理;

    view source print ?
    1. 1 {_id:1,name:"a",status:1,num:1}
    2. 2 {_id:2,name:"a",status:0,num:2}
    3. 3 {_id:3,name:"b",status:1,num:3}
    4. 4 {_id:4,name:"c",status:1,num:4}
    5. 5 {_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后条件,是重点。

相关文章:

  • 二分图的概念汇总
  • HDU 1429(状压+bfs)
  • 树莓派系统安装初级教程
  • POJ 2528(线段树+离散化)
  • hadoop问题与解决办法
  • HDU 4725(最短路之建图难点)
  • QDU首届易途杯大赛-kk与cillyb的荣誉之战
  • Visual Studio 有哪些好用的插件?
  • QDU首届易途杯大赛-ycb老师与一道简单的物理题
  • SqlTest(2013-07-10)
  • 蓝桥杯-K倍区间(前缀和) 分巧克力(二分)
  • Linux下MySQL5.6源码安装
  • HDU-1024 Max Sum Plus Plus(DP)
  • C#开发微信门户及应用(27)-公众号模板消息管理
  • CodeForces 628D(数位DP)
  • [LeetCode] Wiggle Sort
  • 0x05 Python数据分析,Anaconda八斩刀
  • 2017 年终总结 —— 在路上
  • C++类中的特殊成员函数
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • text-decoration与color属性
  • vue:响应原理
  • vue-router的history模式发布配置
  • Vultr 教程目录
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 分享一份非常强势的Android面试题
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 给初学者:JavaScript 中数组操作注意点
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 前端之React实战:创建跨平台的项目架构
  • 如何设计一个比特币钱包服务
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 源码之下无秘密 ── 做最好的 Netty 源码分析教程
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • Python 之网络式编程
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • #{}和${}的区别是什么 -- java面试
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • ()、[]、{}、(())、[[]]命令替换
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (二)斐波那契Fabonacci函数
  • (十八)SpringBoot之发送QQ邮件
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • *** 2003
  • ***测试-HTTP方法
  • .libPaths()设置包加载目录
  • .Net IOC框架入门之一 Unity
  • .NET 指南:抽象化实现的基类
  • .net打印*三角形