2019独角兽企业重金招聘Python工程师标准>>>

mongoDB的管道是个好东西,它可以将很多操作批处理实现,即将多个命令放入一个管道,然后去顺序的执行它们,今天我要说的是,利用管道中的分组来实现实现中的ditinct+group的效果,即先对一个元素去重,然后即一个字段进行分组,如你的userinfoID,它对应多个planID,而我们在planID在表中肯定是重复的,这时,我们需要统计userinfo对应多个种planID,这时问题就来了,尤于planID是重复的,所以分组的结果可能是错误的,它并不是真正意思上的(planID种类),正确的作法应该是先对planID去重复,然后再根据userinfoID去作分组,而这个在大多数的数据库里,是通过多重分组实现的,即选对userinfoID和planID进行分组,然后对结果进行userinfoID的分组,这种就把多于的planID去掉了。

具体作法:

//多分组(group+distinct)
db.M_User_Footprints.aggregate([{ $group: { _id: { UserInfoID: "$UserInfoID", ObjID: "$PlayVideo.ObjID" } } },{ $group: { _id: "$_id.UserInfoID", count: { $sum: 1 } } },{ $sort: { "_id": 1 } }
]);

注意,这里的第二个分组用的是第一个分组的_id,所以加上了$_id,这表示使用上面group的数据源来作为第二个分组的键。

而如果只是单个分组,就很容易实现了,也看一下代码

//单分组
db.M_User_Footprints.aggregate([{ $group: { _id: "$UserInfoID", result: { $sum: 1 } } }
])

从上面两段代码我们可以看到,分组键必须用_id,分组的结果名称可以自己定义,{$sum:1}每次自加1。

下面使用map...reduce也可以实现分组的功能

db.runCommand({mapreduce: "M_User_Footprints",map: function Map() {emit({ "UserInfoID": this.UserInfoID, "ObjID": this.PlayVideo.ObjID },{ count: 1 });},reduce: function Reduce(key, values) {total = 0;//定义一个变量total , values是一个数组for (var i in values) {total += values[i].count}return { "count": total };},finalize: function Finalize(key, reduced) {return reduced;},out: { inline: 1 }
});

转载于:https://my.oschina.net/mickelfeng/blog/1558012

MongoDB学习笔记~管道中的分组实现group+distinct相关推荐

  1. 非关系型数据库MongoDB学习笔记

    MongoDB学习笔记   --周灿 创建数据库 use "databasename" 查看数据库 show dbs 给指定数据库添加集合和插入记录 db.集合名.insert({ ...

  2. MongoDB学习笔记(入门)

    MongoDB学习笔记(入门) 一.文档的注意事项: 1.  键值对是有序的,如:{ "name" : "stephen", "genda" ...

  3. MongoDB学习笔记(一) MongoDB介绍及安装

    系列目录 MongoDB学习笔记(一) MongoDB介绍及安装     MongoDB学习笔记(二) 通过samus驱动实现基本数据操作     MongoDB学习笔记(三) 在MVC模式下通过Jq ...

  4. PHP操作MongoDB学习笔记

    PHP操作MongoDB技術總結 <?php /** * PHP操作MongoDB学习笔记 */ //************************* //**   连接MongoDB数据库  ...

  5. MongoDB学习笔记(四)--索引 性能优化

    索引                                                                                             基础索引 ...

  6. MongoDB学习笔记一:MongoDB的下载和安装

    MongoDB学习笔记一:MongoDB的下载和安装 趁着这几天比較空暇,准备学习一下MongoDB数据库.今天就简单的学习了一些MongoDB的下载和安装.并创建了存储MongoDB的数据仓库. 将 ...

  7. MongoDB 学习笔记八 复制、分片、备份与恢复、监控

    MongoDB 学习笔记八 复制.分片.备份与恢复.监控 MongoDB复制(副本集) 什么是复制? MongoDB 复制原理 MongoDB 副本集设置 副本集添加成员 MongoDB 分片 分片 ...

  8. MongoDB学习笔记~对集合属性的操作

    $unset清除元素 请注意在单个数组元素上使用$unset的结果可能与你设想的不一样.其结果只是将元素的值设置为null,而非删除整个元素.要想彻底删除某个数组元素,可以用$pull 和$pop操作 ...

  9. MongoDB学习笔记(3)- Mongo Shell 常用查询命令

    MongoDB学习笔记(3)- Mongo Shell 常用查询命令 本文所使用的MongoDB版本为 4.0.10 > db.version(); 4.0.10 一.find 命令进行简查询 ...

最新文章

  1. rocketmq 顺序消费_必须先理解的RocketMQ入门手册,才能再次深入解读
  2. linux DNS辅域
  3. 您的浏览器没有获得Java Virtual Machine(JVM)支持。可能由于没有安装JVM或者已安装但是没有启用。请安装JVM1.5或者以上版本,如果已安装则启用它。...
  4. springboot+mybatis-plus实例demo
  5. JAVA头部声明异常,Java 异常详解
  6. windows设置mysql使用率_Windows下配置Mysql
  7. Jquery 获取元素内容
  8. 拒绝做思想的巨人,行动上的矮子
  9. Websocket教程SpringBoot+Maven整合(详情)
  10. Happens before
  11. gif透明背景动画_PS教程:把静态照片做成GIF放大动画效果
  12. 58同城推荐系统设计与实现
  13. Hadoop “Hello World” 示例
  14. 手机屏幕分辨率真的是越高越清晰吗?
  15. LeetCode1175. 质数排列Prime Arrangements
  16. emc4012光纤直连服务器,Dell EMC PowerVault ME4012存储
  17. Ubuntu 16.04 tf-faster-rcnn 在CPU下训练数据
  18. Android-S ANR
  19. C++设计模式——桥接模式(高屋建瓴)
  20. 实习收获—Java后台开发

热门文章

  1. VMware下安装的Mac OS X如何修改显示分辨率
  2. inc指令是什么意思_mips指令集与cpu架构(一)
  3. android+5.0+小米手环,小米手环5和荣耀手环6哪个好-参数对比
  4. 成人高考大学计算机基础答案,江苏省2019年成人高考大学计算机基础统考样卷...
  5. mysql select查询语句_mysql的select查询语句
  6. mysql 优化设计库_数据库优化设计与SQL优化
  7. MyStringUtil.java String工具类
  8. liferay 如何添加css或者js
  9. 如何用python自动改试卷_利用Python和Jinja2自动生成试卷
  10. LeetCode练习及自己理解记录(1)