星空网 > 软件开发 > 数据库

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: 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 }});

 

回到目录




原标题:MongoDB学习笔记~管道中的分组实现group+distinct

关键词:MongoDB

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

盈创无忧网络科技(深圳)有限公司:https://www.ikjzd.com/w/1575312932280721409
跨境者商学院:https://www.ikjzd.com/w/1575372033740234754
c2c:https://www.ikjzd.com/w/1576
b2c电子商务:https://www.ikjzd.com/w/1577
行业b2b:https://www.ikjzd.com/w/1578
闯盟跨境:https://www.ikjzd.com/w/1578595928647639041
TikTok斥资210万美元游说美国参议院阻止法案通过 :https://www.goluckyvip.com/news/188220.html
北京飞机票查询(快速查询北京至各地机票价格和航班信息):https://www.vstour.cn/a/366178.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流