现在的位置: 首页 > 综合 > 正文

6.MongoDB中的聚合

2014年01月03日 ⁄ 综合 ⁄ 共 2241字 ⁄ 字号 评论关闭

写在前面:

什么是聚合呢?聚合说简单点就是数据统计,数据分类。在MySQL中,我们知道,有count来统计总数,distinct去重复,等等。MongoDB中也有这个概念,这就是聚合。

MongoDB中除了基本的查询以外,还有很强大的聚合功能,其中简单的可以计算集合中的文档个数,复杂的可以用MapReduce

1.count 统计数量。

在MongoDB中可以用count来同意一个集合中的文档数量。

> use php  //使用php这个库
switched to db php
> show collections //查看这个库下面有多少个集合
blog
foo
system.indexes
user
> db.blog.count() //使用count查看blog集合中的文档数量。3个。
3
>

当然也可以传递查询。比如查询age=18的人数是多少,也可以。

> db.blog.count({"title":"wowowo"}) //统计title为"wowowo"的文档的个数。为0个
0
> db.blog.count({"title":"wowowowo"})//统计title为"wowowowo"的文档的个数,为2个。
2
>

2.distinct

在MongdoDB中 distinct 用来找出给定键的所有不同的值,即是去重复,使用时,必须制定集合和键。

使用distinct 必须使用runCommand( )结合的方式。db.runCommand( )以前没说过。

> db.runCommand() 
{ "errmsg" : "no such cmd: ", "bad cmd" : { }, "ok" : 0 }
> db.runCommand({"distinct":"blog","key":"title"}) //必须制定集合和键。制定blog集合,title键。
{
        "values" : [
                "wowowowo",
                "okokok"
        ],
        "stats" : {
                "n" : 3,
                "nscanned" : 3,
                "nscannedObjects" : 3,
                "timems" : 15,
                "cursor" : "BasicCursor"
        },
        "ok" : 1
}
> db.runCommand({"distinct":"blog","key":"comments"})  //制定blog集合,comments键
{
        "values" : [
                "hao a hao a ",
                "23224"
        ],
        "stats" : {
                "n" : 3,
                "nscanned" : 3,
                "nscannedObjects" : 3,
                "timems" : 0,
                "cursor" : "BasicCursor"
        },
        "ok" : 1
}
> db.runCommand({"distinct":"blog","key":"time"}) //key键。
{
        "values" : [
                ISODate("2012-01-10T03:38:45.515Z"),
                "2011023023"
        ],
        "stats" : {
                "n" : 3,
                "nscanned" : 3,
                "nscannedObjects" : 3,
                "timems" : 0,
                "cursor" : "BasicCursor"
        },
        "ok" : 1
}
>

3.group

MongoDB中的group和mysql中的group分组差不多。

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

比如有以下数据:表示股价的结合包含以千计的如下形式的文档。

{"day":"2010/10/03","time":"10/3/2010 03:57:01 GMT-400","price":4.23}
{"day":"2010/10/04","time":"10/4/2010 11:28:34 GMT-400","price":4.27}
{"day":"2010/10/03","time":"10/3/2010 05:00:51 GMT-400","price":4.10}
{"day":"2010/10/06","time":"10/6/2010 05:27:22 GMT-400","price":4.30}
{"day":"2010/10/04","time":"10/4/2010 08:24:58 GMT-400","price":4.01}

我们想获得介绍是每天的最后的价格表,就像这样:

{"day":"2010/10/03","time":"10/3/2010 05:00:51 GMT-400","price":4.10}
{"day":"2010/10/04","time":"10/4/2010 11:28:34 GMT-400","price":4.27}
{"day":"2010/10/06","time":"10/6/2010 05:27:22 GMT-400","price":4.30}

那么我们用group如何做到像这样的分组呢?

> db.runCommand({"group":{
... "ns":"stocks",
... "key":"day",
... "initial":{"time":0},
... "$reduce":function(doc,prev){
... if(doc.time>prev.time){
... prev.price=doc.price;
... prev.time=doc.time;
... }
... }}})
{
        "retval" : [
                {
                        "time" : 0
                }
        ],
        "count" : 5,
        "keys" : 1,
        "ok" : 1
}
>



【上篇】
【下篇】

抱歉!评论已关闭.