MongoDB教程之聚合(count、distinct和group)

1. count:

代码如下:

--在空集合中,count返回的数量为0。
    > db.test.count()
    0
    --测试插入一个文档后count的返回值。
    > db.test.insert({"test":1})
    > db.test.count()
    1
    > db.test.insert({"test":2})
    > db.test.count()
    2
    --count和find一样,也接受条件。从结果可以看出,只有符合条件的文档参与了计算。
    > db.test.count({"test":1})
    1

2. distinct:

distinct用来找出给定键的所有不同的值。使用时也必须指定集合和键。
 

代码如下:

--为了便于后面的测试,先清空测试集合。
    > db.test.remove()
    > db.test.count()
    0
    --插入4条测试数据。请留意Age字段。
    > db.test.insert({"name":"Ada", "age":20})
    > db.test.insert({"name":"Fred", "age":35})
    > db.test.insert({"name":"Andy", "age":35})
    > db.test.insert({"name":"Susan", "age":60})
    --distinct命令必须指定集合名称,如test,以及需要区分的字段,如:age。
    --下面的命令将基于test集合中的age字段执行distinct命令。
    > db.runCommand({"distinct":"test", "key":"age"})
    {
            "values" : [
                    20,
                    35,
                    60
            ],
            "stats" : {
                    "n" : 4,
                    "nscanned" : 4,
                    "nscannedObjects" : 4,
                    "timems" : 0,
                    "cursor" : "BasicCursor"
            },
            "ok" : 1
    }

3. group:
    group做的聚合有些复杂。先选定分组所依据的键,此后MongoDB就会将集合依据选定键值的不同分成若干组。然后可以通过聚合每一组内的文档,产生一个结果文档。
 

代码如下:

--这里是准备的测试数据
    > db.test.remove()
    > db.test.insert({"day" : "2012-08-20", "time" : "2012-08-20 03:20:40", "price" : 4.23})
    > db.test.insert({"day" : "2012-08-21", "time" : "2012-08-21 11:28:00", "price" : 4.27})
    > db.test.insert({"day" : "2012-08-20", "time" : "2012-08-20 05:00:00", "price" : 4.10})
    > db.test.insert({"day" : "2012-08-22", "time" : "2012-08-22 05:26:00", "price" : 4.30})
    > db.test.insert({"day" : "2012-08-21", "time" : "2012-08-21 08:34:00", "price" : 4.01})
    --这里将用day作为group的分组键,然后取出time键值为最新时间戳的文档,同时也取出该文档的price键值。
    > db.test.group( {
    ... "key" : {"day":true},           --如果是多个字段,可以为{"f1":true,"f2":true}
    ... "initial" : {"time" : "0"},       --initial表示$reduce函数参数prev的初始值。每个组都有一份该初始值。
    ... "$reduce" : function(doc,prev) {  --reduce函数接受两个参数,doc表示正在迭代的当前文档,prev表示累加器文档。
    ...     if (doc.time > prev.time) {
    ...         prev.day = doc.day
    ...         prev.price = doc.price;
    ...         prev.time = doc.time;
    ...     }
    ... } } )
    [
        {
            "day" : "2012-08-20",
            "time" : "2012-08-20 05:00:00",
            "price" : 4.1
        },
        {
            "day" : "2012-08-21",
            "time" : "2012-08-21 11:28:00",
            "price" : 4.27
        },
        {
            "day" : "2012-08-22",
            "time" : "2012-08-22 05:26:00",
            "price" : 4.3
        }
    ]
    --下面的例子是统计每个分组内文档的数量。
    > db.test.group( {
    ... key: { day: true},
    ... initial: {count: 0},
    ... reduce: function(obj,prev){ prev.count++;},
    ... } )
    [
        {
            "day" : "2012-08-20",
            "count" : 2
        },
        {
            "day" : "2012-08-21",
            "count" : 2
        },
        {
            "day" : "2012-08-22",
            "count" : 1
        }
    ]
    --最后一个是通过完成器修改reduce结果的例子。
    > db.test.group( {
    ... key: { day: true},
    ... initial: {count: 0},
    ... reduce: function(obj,prev){ prev.count++;},
    ... finalize: function(out){ out.scaledCount = out.count * 10 } --在结果文档中新增一个键。
    ... } )
    [
        {
            "day" : "2012-08-20",
            "count" : 2,
            "scaledCount" : 20
        },
        {
            "day" : "2012-08-21",
            "count" : 2,
            "scaledCount" : 20
        },
        {
            "day" : "2012-08-22",
            "count" : 1,
            "scaledCount" : 10
        }   
    ]

(0)

相关推荐

  • MongoDB入门教程之聚合和游标操作介绍

    今天跟大家分享一下mongodb中比较好玩的知识,主要包括:聚合,游标. 一: 聚合 常见的聚合操作跟sql server一样,有:count,distinct,group,mapReduce. <1> count count是最简单,最容易,也是最常用的聚合工具,它的使用跟我们C#里面的count使用简直一模一样.  <2> distinct 这个操作相信大家也是非常熟悉的,指定了谁,谁就不能重复,直接上图.  <3> group 在mongodb里面做group操作

  • Mongodb聚合函数count、distinct、group如何实现数据聚合操作

    上篇文章给大家介绍了Mongodb中MapReduce实现数据聚合方法详解,我们提到过Mongodb中进行数据聚合操作的一种方式--MapReduce,但是在大多数日常使用过程中,我们并不需要使用MapReduce来进行操作.在这边文章中,我们就简单说说用自带的聚合函数进行数据聚合操作的实现. MongoDB除了基本的查询功能之外,还提供了强大的聚合功能.Mongodb中自带的基本聚合函数有三种:count.distinct和group.下面我们分别来讲述一下这三个基本聚合函数. (1)coun

  • MongoDB聚合功能浅析

    MongoDB数据库功能强大!除了基本的查询功能之外,还提供了强大的聚合功能.这里简单介绍一下count.distinct和group. 1.count: --在空集合中,count返回的数量为0. > db.test.count() 0 --测试插入一个文档后count的返回值. > db.test.insert({"test":1}) > db.test.count() 1 > db.test.insert({"test":2}) >

  • Mongodb中MapReduce实现数据聚合方法详解

    Mongodb是针对大数据量环境下诞生的用于保存大数据量的非关系型数据库,针对大量的数据,如何进行统计操作至关重要,那么如何从Mongodb中统计一些数据呢? 在Mongodb中,给我们提供了三种用于数据聚合的方式: (1)简单的用户聚合函数: (2)使用aggregate进行统计: (3)使用mapReduce进行统计: 今天我们首先来讲讲mapReduce是如何统计,在后续的文章中,将另起文章进行相关说明. MapReduce是啥呢?以我的理解,其实就是对集合中的各个满足条件的文档进行预处理

  • mongodb聚合_动力节点Java学院整理

    今天跟大家分享一下mongodb中比较好玩的知识,主要包括:聚合,游标. 一:聚合 常见的聚合操作跟sql server一样,有:count,distinct,group,mapReduce. <1> count count是最简单,最容易,也是最常用的聚合工具,它的使用跟我们C#里面的count使用简直一模一样. <2> distinct 这个操作相信大家也是非常熟悉的,指定了谁,谁就不能重复,直接上图. <3> group 在mongodb里面做group操作有点小

  • MongoDB的聚合框架Aggregation Framework入门学习教程

    1. 聚合框架 使用聚合框架对集合中的文档进行变换和组合,可以用多个构件创建一个管道(pipeline),用于对一连串的文档进行处理.这些构件包括筛选(filtering),投射(projecting),分组(grouping),排序(sorting),限制(limiting),跳过(skipping). 例如一个保存着动物类型的集合,希望找出最多的那种动物,假设每种动物被保存为一个mongodb文档,可以按照以下步骤创建管道. 1)将每个文档的动物名称映射出来. 2)安装名称排序,统计每个名称

  • MongoDB教程之聚合(count、distinct和group)

    1. count: 复制代码 代码如下: --在空集合中,count返回的数量为0.     > db.test.count()     0     --测试插入一个文档后count的返回值.     > db.test.insert({"test":1})     > db.test.count()     1     > db.test.insert({"test":2})     > db.test.count()     2  

  • 使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT

    例如这样一个表,我想统计email和passwords都不相同的记录的条数 复制代码 代码如下: CREATE TABLE IF NOT EXISTS `test_users` ( `email_id` int(11) unsigned NOT NULL auto_increment, `email` char(100) NOT NULL, `passwords` char(64) NOT NULL, PRIMARY KEY (`email_id`) ) ENGINE=MyISAM DEFAUL

  • MySQL中distinct与group by之间的性能进行比较

    最近在网上看到了一些测试,感觉不是很准确,今天亲自测试了一番.得出了结论,测试过程在个人计算机上,可能不够全面,仅供参考. 测试过程: 准备一张测试表 CREATE TABLE `test_test` ( `id` int(11) NOT NULL auto_increment, `num` int(11) NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1

  • MySQL中distinct与group by语句的一些比较及用法讲解

    在数据表中记录了用户验证时使用的书目,现在想取出所有书目,用DISTINCT和group by都取到了我想要的结果,但我发现返回结果排列不同,distinct会按数据存放顺序一条条显示,而group by会做个排序(一般是ASC).           DISTINCT 实际上和 GROUP BY 操作的实现非常相似,只不过是在 GROUP BY 之后的每组中只取出一条记录而已.所以,DISTINCT 的实现和 GROUP BY 的实现也基本差不多,没有太大的区别,同样可以通过松散索引扫描或者是

  • Mysql中distinct与group by的去重方面的区别

    distinct简单来说就是用来去重的,而group by的设计目的则是用来聚合统计的,两者在能够实现的功能上有些相同之处,但应该仔细区分. 单纯的去重操作使用distinct,速度是快于group by的. distinct支持单列.多列的去重方式. 单列去重的方式简明易懂,即相同值只保留1个. 多列的去重则是根据指定的去重的列信息来进行,即只有所有指定的列信息都相同,才会被认为是重复的信息. group by使用的频率相对较高,但正如其功能一样,它的目的是用来进行聚合统计的,虽然也可能实现去

  • MySQL去重该使用distinct还是group by?

    前言 关于group by 与distinct 性能对比:网上结论如下,不走索引少量数据distinct性能更好,大数据量group by 性能好,走索引group by性能好.走索引时分组种类少distinct快.关于网上的结论做一次验证. 准备阶段屏蔽查询缓存 查看MySQL中是否设置了查询缓存.为了不影响测试结果,需要关闭查询缓存. show variables like '%query_cache%'; 查看是否开启查询缓存决定于query_cache_type和query_cache_

  • MySQL去重中distinct和group by的区别浅析

    今天在写业务需要对数据库重复字段进行去重时,因为是去重,首先想到的是distinct关键字.于是一小时过去了....(菜鸟一个,大家轻点骂) 我把问题的过程用sql语句演示给大家演示一下 首先我使用的是mybatis-plus,代码如下 QueryWrapper<ProjectCompany> wrapper = new QueryWrapper<>(); wrapper.select("DISTINCT project_id,company_id,company_nam

  • MySQL中的distinct与group by比较使用方法

    目录 distinct的使用 distinct用法 distinct 多列去重 group by的使用 单列去重 多列去重 区别示例 distinct和group by原理 隐式排序 先说大致的结论 : 在语义相同,有索引的情况下:group by和 distinct 都能使用索引,效率相同. 在语义相同,无索引的情况下:distinct 效率高于group by.原因是 distinct 和 group by都会进行分组操作,但group by可能会进行排序,触发 filesort,导致 sq

随机推荐