MongoDB学习笔记~管道中的分组实现group+distinct
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: } } },
{ $sort: { "_id": } }
]);
注意,这里的第二个分组用的是第一个分组的_id,所以加上了$_id,这表示使用上面group的数据源来作为第二个分组的键。
而如果只是单个分组,就很容易实现了,也看一下代码
//单分组
db.M_User_Footprints.aggregate([
{ $group: { _id: "$UserInfoID", result: { $sum: } } }
])
从上面两段代码我们可以看到,分组键必须用_id,分组的结果名称可以自己定义,{$sum:1}每次自加1。
下面使用map...reduce也可以实现分组的功能
db.runCommand({
mapreduce: "M_User_Footprints",
map: function Map() {
emit(
{ "UserInfoID": this.UserInfoID, "ObjID": this.PlayVideo.ObjID }
,
{ count: }
);
},
reduce: function Reduce(key, values) {
total = ;//定义一个变量total , values是一个数组
for (var i in values) {
total += values[i].count
}
return { "count": total };
},
finalize: function Finalize(key, reduced) {
return reduced;
},
out: { inline: }
});
MongoDB学习笔记~管道中的分组实现group+distinct的更多相关文章
- MongoDB学习笔记系列
回到占占推荐博客索引 该来的总会来的,Ef,Redis,MVC甚至Sqlserver都有了自己的系列,MongoDB没有理由不去整理一下,这个系列都是平时在项目开发时总结出来的,希望可以为各位一些帮助 ...
- MongoDB学习笔记系列~目录
MongoDB学习笔记~环境搭建 (2015-03-30 10:34) MongoDB学习笔记~MongoDBRepository仓储的实现 (2015-04-08 12:00) MongoDB学习笔 ...
- mongoDB 学习笔记纯干货(mongoose、增删改查、聚合、索引、连接、备份与恢复、监控等等)
最后更新时间:2017-07-13 11:10:49 原始文章链接:http://www.lovebxm.com/2017/07/13/mongodb_primer/ MongoDB - 简介 官网: ...
- MongoDB学习笔记:快速入门
MongoDB学习笔记:快速入门 一.MongoDB 简介 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.M ...
- MongoDB学习笔记:MongoDB 数据库的命名、设计规范
MongoDB学习笔记:MongoDB 数据库的命名.设计规范 第一部分,我们先说命名规范. 文档 设计约束 UTF-8 字符 不能包含 \0 字符(空字符),这个字符标识建的结尾 . 和 $ ...
- PHP操作MongoDB学习笔记
<?php/*** PHP操作MongoDB学习笔记*///*************************//** 连接MongoDB数据库 **////*************** ...
- MongoDB 学习笔记(原创)
MongoDB 学习笔记 mongodb 数据库 nosql 一.数据库的基本概念及操作 SQL术语/概念 MongoDB术语/概念 解释/说明 database database 数据库 table ...
- 【转】MongoDB学习笔记(查询)
原文地址 MongoDB学习笔记(查询) 基本查询: 构造查询数据. > db.test.findOne() { "_id" : ObjectId("4fd58ec ...
- MongoDB学习笔记(五)--复制集 && sharding分片
主从复制 主从节点开启 主节 ...
随机推荐
- jdk线程池主要原理
本文转自:http://blog.csdn.net/linchengzhi/article/details/7567397 正常创建一个线程的时候,我们是这样的:new thread(Runnable ...
- 【PHP面向对象(OOP)编程入门教程】23.自动加载类 __autoload()函数
很多开发者写面向对象的应用程序时,对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表. 在软件开发的系统中,不可能把所有的类都写在 ...
- 搭建OpenGL环境-Windows/VS2013
对于opengl的环境,简单搭建的话其实和opencv差不多,你会看到下面的过程与opencv类似,不同的就是某些文件需要自己找(因为不是集成的,各个拓展需要单独下载) 1.首先,对于opengl头文 ...
- Spark计算均值
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用spark来快速计算分组的平均值,写法很便捷,话不多说上代码 object ColumnVal ...
- Java 技能树
- 小白Linux入门 一
1 win7电脑上安装虚拟机,准备文件 vmware 12 http://www.orsoon.com/Soft/89658.html ubuntu 16.04 http://cn.ubuntu.c ...
- npm包与gem包--在线&离线安装
目录 NPM 在线 离线 GEM 在线 离线 NPM NPM,即为Node的包管理工具,官网为 https://www.npmjs.com/,我们可以在站内搜索所需要的NPM包,了解相关的使用规则 安 ...
- Visual Studio 2008 Package Load Failure:未能正确加载包“Microsoft.VisualStudio.Xaml”
在安装好Visual Studio 2008后,启动Visual Studio 2008 发现如下提示: 包加载失败 未能正确加载包“Microsoft.VisualStudio.Xaml”( GUI ...
- LINQ to SQL语句(11)之Update
说明:更新操作,先获取对象,进行修改操作之后,直接调用SubmitChanges()方法即可提交.注意,这里是在同一个DataContext中,对于不同的DataContex看下面的讲解. 1.简单形 ...
- iOS面试题集锦
一.前言部分 文中的问题多收集整理自网络,不保证100%准确,还望斟酌采纳. 1.怎样防止指针的越界使用问题? 答案: 1 .防止数组越界,必须让指针指向一个有效的内存地址, 2. 防止向一块内存中拷 ...