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

  • 相关阅读:
    个人冲刺二(7)
    个人冲刺二(6)
    个人冲刺二(5)
    个人冲刺二(4)
    对称二叉树 · symmetric binary tree
    108 Convert Sorted Array to Binary Search Tree数组变成高度平衡的二叉树
    530.Minimum Absolute Difference in BST 二叉搜索树中的最小差的绝对值
    pp 集成工程师 mism师兄问一问
    17. Merge Two Binary Trees 融合二叉树
    270. Closest Binary Search Tree Value 二叉搜索树中,距离目标值最近的节点
  • 原文地址:https://www.cnblogs.com/AlvinLee/p/6069637.html
Copyright © 2011-2022 走看看