zoukankan      html  css  js  c++  java
  • MongoDB学习笔记——聚合操作之group,distinct,count

    单独的聚合命令(group,distinct,count

    单独聚合命令 aggregate性能低,比Map-reduce灵活度低;但是可以节省几行javascript代码,后面那句话我自己加的,哈哈哈~

    count()方法可以查询统计符合条件的集合的总数

    db.COLLECTION_NAME.count(<query>) // 此方法等价于 db.COLLECTION_NAME.find(<query>).count()

    在分布式集合中,会出现计算错误的情况,这个时候推荐使用aggregate

    distinct命令可以找出给定键的所有去重之后的值。使用时也必须指定集合和键

    db.runCommand({ distinct: "<collection>", key: "<field>", query: <query> }) //此方法等价于 db.collection.distinct(field, query)

    参数说明:

    • collection :要查询的集合的名称
    • key:需要去重的字段的名称
    • query :可选参数, 指明查询条件,相当于SQL中的where语句

    Group操作:mongodb2.2版本对于返回数据最多只包涵20000个元素,最多支持20000独立分组;对于超过20000的独立分组建议采用mapreduce

    db.runCommand({

    group:

    {

    ns: <namespace>,

    key: <key>,

    $reduce: <reduce function>,

    $keyf: <key function>,

    cond: <query>,

    finalize: <finalize function>

    }

    }) //该方法等价于 db.collection.group({ key, reduce, initial [, keyf] [, cond] [, finalize] })

    参数说明

    • ns:集合名称
    • key:用来分组文档的字段。和keyf两者必须有一个
    • keyf:可以接受一个javascript函数。用来动态的确定分组文档的字段。和key两者必须有一个
    • initialreduce中使用变量的初始化
    • reduce:执行的reduce函数。函数需要返回值。
    • cond:执行过滤的条件。
    • finallize:在reduce执行完成,结果集返回之前对结果集最终执行的函数。可选的。

    插入测试数据

    for(var i=1; i<20; i++){

    var num=i%6;

    db.test.insert({_id:i,name:"user_"+i,age:num});

    }

    普通分组查询

     

    db.test.group({

    key:{age:true},

    initial:{num:0},

    $reduce:function(doc,prev){

    prev.num++

    }

    });

    db.runCommand({

    group: {

    ns: "test",

    key: {

    age: true

    },

    initial: {

    num: 0

    },

    $reduce: function(doc,

    prev){

    prev.num++

    }

    }

    });

    筛选后分组查询

     

    db.test.group({

    key: {

    age: true

    },

    initial: {

    num: 0

    },

    $reduce: function(doc,

    prev){

    prev.num++

    },

    condition: {

    age: {

    $gt: 2

    }

    }

    });

    db.runCommand({

    group: {

    ns: "test",

    key: {

    age: true

    },

    initial: {

    num: 0

    },

    $reduce: function(doc,

    prev){

    prev.num++

    },

    condition: {

    age: {

    $gt: 2

    }

    }

    }

    });

    group联合$where查询

     

    db.test.group({

    key: {

    age: true

    },

    initial: {

    num: 0

    },

    $reduce: function(doc,

    prev){

    prev.num++

    },

    condition: {

    $where: function(){

    returnthis.age>2;

    }

    }

    });

    使用函数返回值分组

     

    //注意,$keyf指定的函数一定要返回一个对象

    db.test.group({

    $keyf: function(doc){

    return{

    age: doc.age

    };

    },

    initial: {

    num: 0

    },

    $reduce: function(doc,

    prev){

    prev.num++

    }

    });

    db.runCommand({

    group: {

    ns: "test",

    $keyf: function(doc){

    return{

    age: doc.age

    };

    },

    initial: {

    num: 0

    },

    $reduce: function(doc,

    prev){

    prev.num++

    }

    }

    });

    使用终结器

     

    db.test.group({

    $keyf: function(doc){

    return{

    age: doc.age

    };

    },

    initial: {

    num: 0

    },

    $reduce: function(doc,

    prev){

    prev.num++

    },

    finalize: function(doc){

    doc.count=doc.num;deletedoc.num;

    }

    });

    db.runCommand({

    group: {

    ns: "test",

    $keyf: function(doc){

    return{

    age: doc.age

    };

    },

    initial: {

    num: 0

    },

    $reduce: function(doc,

    prev){

    prev.num++

    },

    finalize: function(doc){

    doc.count=doc.num;deletedoc.num;

    }

    }

    });

    关系型数据库与MongoDB数据库在一些术语上的对

    MongoDB操作符

    范例

    关系型数据库(mysql)

    关系型数据库范例

    count()

    count({"key":value}) find({"key":value}).count()

    count

    select count(1) from table where key=value

    distinct

    db.runCommand({"distinct":collectionname, "key":"key1",{'key2':value2}}) db.collectionname.distinct("key1",{key2:value2})

    distinct

    select distinct key1 from table where key2=value2

    group

    db.test.group({ key:{age:true}, initial:{num:0}, $reduce:function(doc,prev){ prev.num++ }, condition:{$where:function(){ return this.age>2; } } });

    group by

    select count(1),key1 from table where key2=1 group by key1

  • 相关阅读:
    BZOJ 3626: [LNOI2014]LCA(树链剖分+离线处理)
    python备用
    STL的使用。。备忘
    DP专题
    任务
    hdu 网络流题集
    hdu KM匹配题集
    hdu 差分约束题集
    hdu 2sat题集
    Codeforces Round #261 (Div. 2)
  • 原文地址:https://www.cnblogs.com/AlvinLee/p/6069637.html
Copyright © 2011-2022 走看看