zoukankan      html  css  js  c++  java
  • 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 }
    });

    回到目录

  • 相关阅读:
    PSR
    php类与对象
    二进制、位运算及其用处
    安装LNMP笔记
    计算机基础
    Python3编写HFS(CVE2014-6287)检测脚本
    windows和iis对应版本关系
    phpStudy8.1.0.1配置子域名多网站
    Xml外部实体注入
    xss小游戏通关-全答案
  • 原文地址:https://www.cnblogs.com/lori/p/4597341.html
Copyright © 2011-2022 走看看