`

MongoDB-基础-05-聚合

阅读更多

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

 

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

        }    

    ]

 

分享到:
评论

相关推荐

    mongodb-linux-x86_64-2.2.6.tgz

    一、MongoDB基础知识 MongoDB以JSON(JavaScript Object Notation)格式存储数据,这种格式灵活且易于理解和处理。数据以文档的形式存储,每个文档都是一组键值对,类似于JavaScript的对象。MongoDB支持丰富的查询...

    mongodb-linux-x86_64-rhel70-3.6.4.tgz

    2. **聚合框架优化**:MongoDB的聚合框架得到了显著增强,性能提升显著,使得数据处理更加高效,特别是对于数据分析和报告生成。 3. **变更流**:这是一个实时数据更改的API,允许应用程序订阅并接收数据库中的实时...

    mongodb-linux-x86_64-rhel62-v3.4-latest.tgz

    MongoDB 3.4系列是一个稳定且功能丰富的版本,它引入了许多新特性,例如聚合框架的改进、新的存储引擎——WiredTiger,以及对TLS/SSL加密的支持,增强了数据安全性和性能。 描述中提到"centos6.2 + 不是centos7.0...

    mongodb-linux-x86_64-rhel62-4.2.5.tgz

    总结来说,MongoDB 4.2.5针对RHEL 6.2提供了强大的数据存储、处理和管理能力,其事务支持、聚合框架优化、安全增强、实时变更监听以及丰富的运维工具,使其成为现代应用程序的理想选择。通过深入理解和熟练运用这些...

    mongodb-linux-x86_64-rhel70-4.4.13安装包和conf配置文件

    你现在已经具备了运行、管理MongoDB数据库的基础知识,可以进一步探索复制集、分片、索引、聚合等功能,以满足更复杂的应用场景。同时,作为运维人员,了解数据库性能监控、备份恢复以及安全性策略也是必不可少的...

    mongodb-linux-s390x-rhel72-4.2.0.tgz

    MongoDB在RHEL上运行可以受益于其成熟的系统管理和安全特性,为生产环境提供稳定的运行基础。 - RHEL 7.2是该系列的一个版本,它支持更新的技术如KVM虚拟化和OpenSSL 1.0.2,同时也包括对Docker等容器技术的支持,...

    mongodb-windows-x86_64-5.0.6-signed.zip

    9. **云服务**:MongoDB还提供了MongoDB Atlas,一个完全托管的云数据库服务,用户无需关心基础设施维护。 在使用MongoDB时,开发者需要了解如何配置数据库、创建集合、插入和查询文档,以及如何进行备份和恢复操作...

    mongodb-linux-x86_64-ubuntu1604-4.0.0

    - **聚合框架改进**:聚合管道的性能得到提升,同时增加了新的聚合操作符,如`$merge`和`$out`,使得数据分析更为强大。 - **安全增强**:支持了角色基础的访问控制(RBAC),提供了更细粒度的权限管理,以及增强的...

    mongodb-linux-x86_64-rhel70-3.6.3.tgz

    5. **读写分离与分片**:MongoDB的分片功能允许在多台机器上分散数据,提高读写性能,3.6版本在此基础上进一步优化了分片策略。 6. **新的备份工具**:推出了Mongodump和Mongorestore的新版本,提供了更快、更可靠...

    mongodb-osx-ssl-x86_64-4.0.9.tgz

    MongoDB 是一个流行的开源、分布式文档数据库系统,它以其灵活性、高性能和易用性而备受赞誉。...在 macOS 上使用带有 SSL 支持的 MongoDB,可以确保本地开发环境的安全性,为开发高安全性的应用打下坚实基础。

    mongodb-linux-x86_64-3.4.6

    2. **查询性能**:MongoDB支持丰富的查询语法,包括聚合框架、地理空间索引、正则表达式匹配等。3.4.6版本进一步提升了查询性能,特别是在大规模数据集上的复杂查询,通过查询优化器进行更智能的计划选择。 3. **...

    mongodb-windows-x86_64-4.4.0-signed

    2. **聚合框架增强**:MongoDB的聚合框架允许对数据进行高效分析,4.4版本增强了窗口函数,如`lead()`和`lag()`,可以用于计算相邻文档之间的差异或趋势。 3. **存储引擎优化**:WiredTiger存储引擎在4.4版本中进行...

    mongodb-java驱动,内含3个jar包和一个JAVA测试类

    在实际开发中,可以使用MongoDB Java驱动构建复杂的查询、聚合操作和数据处理逻辑,配合Spring Data MongoDB等高级框架,可以进一步简化开发工作,提高效率。对于分布式应用,驱动还支持分片、复制集等高级特性,...

    mongodb-linux-x86_64-v3.6-latest.tgz

    9. **安全性**:MongoDB 3.6引入了X509认证、角色基础的访问控制(RBAC)和加密功能,增强了数据的安全性和合规性。 10. **性能优化**:MongoDB支持索引、聚合框架和查询优化器,能有效提高查询速度。此外,其内置...

    mongodb-cxx-driver-r3.6.2使用vs2017编译的项目和测试代码

    首先,`mongo-c-driver-1.17.3.tar.gz`是一个C语言的MongoDB驱动程序,它是C++驱动的基础,提供了基础的网络通信和认证功能。解压后,`mongo-c-driver-1.17.3`目录包含源码和编译所需文件,开发者可以使用CMake来...

    mongoDB-CURD操作-----JAVA

    了解这些基础后,你可以进一步探索更多高级特性,如索引、副本集、分片等,以便在实际项目中更高效地利用MongoDB。记住,实践是学习的最佳途径,动手尝试这些示例,结合MongoDB_Demo中的代码,你会更快掌握MongoDB与...

    spring-data-mongodb-1.2.0.RELEASE

    1. MongoDBTemplate:是 Spring Data MongoDB 提供的基础访问层,用于执行各种数据库操作,如插入、查询、更新和删除。 2. Repository 接口:通过继承 MongoRepository 接口,可以定义基本的 CRUD 方法,甚至自定义...

    Mongodb java包

    - **聚合操作**:MongoDB的聚合框架允许对数据进行分析和处理,如计算平均值、分组统计等。 ```java AggregateIterable<Document> aggregate = collection.aggregate(Arrays.asList( unwind("$items"), group("$...

    mongodb-基础知识和高级知识

    这个资料包包含了“mongodb_base.pdf”和“mongodb_advance.pdf”两个文件,分别涵盖了MongoDB的基础知识和高级知识。 首先,让我们从基础开始。MongoDB的基础知识主要包括以下几个方面: 1. 数据模型:MongoDB...

    mongodb的java驱动jar包3.7.0

    在MongoDB中,数据通常是以BSON形式存储的,因此这个库是Java驱动程序与MongoDB交互的基础。它提供了解析和生成BSON文档的工具,包括`BsonDocument`和`BsonValue`等类,方便了数据的转换和处理。 在3.7.0版本中,...

Global site tag (gtag.js) - Google Analytics