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})
    > 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
        }    
    ]

參考:http://www.cnblogs.com/stephen-liu74/archive/2012/09/19/2652308.html

??

时间: 2024-10-13 11:39:40

MongoDB 聚合查询的相关文章

mongodb聚合查询

MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*). $sum 计算总和. db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) $avg 计算平均值 db.mycol.aggregate([{$group : {_id : "$by_use

记一次mongodb聚合查询

先说一下场景,产品中用到了简单的表单构造器,开始提供了一系列的控件,例如单行文本框.多行文本框.单选.复选.时间等,之后你可以拖拽控件自己组装你想要的表单……网上有很多的表单构造器,这里就不细说了,可能功能有多有少,但是原理类似.因为这种表单的这种实现方式,我们不单单要存储表单的真实数据,还要存储对应表单的配置数据来渲染表单的样子.这里不细说配置相关的事情,细说一下表单数据的存储和查询. 对于一条记录有很多共有属性:主键ID.创建用户ID.创建时间.表单ID(用于读取表单配置)等一些业务数据,这

python操作mongodb之二聚合查询

#聚合查询 from pymongo import MongoClient db = MongoClient('mongodb://10.0.0.9:27017/').aggregation_example #准备数据 result = db.things.insert_many([{"x": 1, "tags": ["dog", "cat"]}, {"x": 2, "tags": [&

MongoDB的使用学习之(七)MongoDB的聚合查询(两种方式)附项目源码

先来张在路上-- 此项目是用Maven创建的,没有使用Maven的,自己百度.谷歌去:直接用Junit测试就行,先执行里面的save方法,添加10000条测试数据提供各种聚合查询等. 废话不多说,上干货-- 一.MongoDB数据库的配置(mongodb.xml) 以下是我自己的配置,红色字体请改为自己本机的东东,你说不懂设置端口,不会创建数据库名称,不会配置用户名密码,那有请查阅本系列的第4节(MongoDB的使用学习之(四)权限设置--用户名.密码.端口==),你说懒得设置,那就@#¥%--

mongodb高级聚合查询

在工作中会经常遇到一些mongodb的聚合操作,特此总结下.mongo存储的可以是复杂类型,比如数组.对象等mysql不善于处理的文档型结构,并且聚合的操作也比mysql复杂很多. 注:本文基于 mongodb v3.6 目录 mongo与mysql聚合类比 aggregate简介 aggregate语法 aggregate常用pipeline stage介绍(本文核心) mongo与mysql聚合类比 为了便于理解,先将常见的mongo的聚合操作和mysql的查询做下类比: SQL 操作/函数

Mongodb聚合操作之读书笔记

Mongodb聚合操作 读书笔记 mongodb,两种计算聚合pipeline和mapreduce pipeline查询速度快于mapreduce,但MapReduce能够在多台Server上并行执行复杂的聚合逻辑. mongodb不允许Pipeline的单个聚合操作占用过多的系统内存,如果一个聚合操作消耗20%以上的内存,那么mongodb直接停止操作,并向客户端输出错误消息. Pipeline方式使用db.collection.aggregate()函数进行聚合运算,运算速度较快,操作简单.

【Mongodb教程 第十一课 】MongoDB 聚合

聚合操作过程中的数据记录和计算结果返回.聚合操作分组值从多个文档,并可以执行各种操作,分组数据返回单个结果.在SQL COUNT(*)和group by 相当于MongoDB的聚集. aggregate() 方法 对于在MongoDB中聚集,应该使用aggregate()方法. 语法: aggregate() 方法的基本语法如下 >db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION) 例子: 在集合中,有以下的数据: { _id: ObjectId(

MongoDB 聚合管道(Aggregation Pipeline)

MongoDB 聚合管道(Aggregation Pipeline) - 张善友 时间 2013-12-27 22:40:00            博客园_张善友相似文章 (0)原文                  http://www.cnblogs.com/shanyou/p/3494854.html添加到推刊 收藏到推刊创建推刊 收 藏  取消 已收藏到推刊! 创建推刊 × Modal header --> 请填写推刊名 描述不能大于100个字符! 权限设置: 公开    仅自己可见

mongodb聚合(转)

聚合 是泛指各种可以处理批量记录并返回计算结果的操作.MongoDB提供了丰富的聚合操作,用于对数据集执行计算操作.在 mongod 实例上执行聚合操作可以大大简化应用的代码,并降低对资源的消耗. 聚合有比较简单的 count 计算总数:distinct去重:group by 分组.也有比较复杂的管道聚合.下面将分别讲述. appuser 集合 具有如下文档 {name:"人间四月",age:20,"locate":" 北京"} {name:&q