读书人

MongoDB权威指南(五)- 聚合

发布时间: 2012-08-11 20:50:31 作者: rapoo

MongoDB权威指南(5)- 聚合

除了基本的查询功能外,mongoDB还提供了聚合工具,从简单的计数到使用MapReduce进行复杂数据的分析等。

1.count

最简单的聚合工具就是count了,它返回document的数量

>?db.foo.count()
0
>?db.foo.insert({"x"?:?1})
>?db.foo.count()
1

也可以传递一个查询条件,计算符合条件的结果个数

>?db.foo.insert({"x"?:?2})
>?db.foo.count()
2
>?db.foo.count({"x"?:?1})
1


2.distinct

distinct命令返回指定的key的所有不同的值。你必须指定一个collection和一个key。

>?db.runCommand({"distinct"?:?"people",?"key"?:?"age"})

假设我们的collection里的document是这样子的:

{"name"?:?"Ada",?"age"?:?20}
{"name"?:?"Fred",?"age"?:?35}
{"name"?:?"Susan",?"age"?:?60}
{"name"?:?"Andy",?"age"?:?35}

那么返回的结果就是

>?db.runCommand({"distinct"?:?"people",?"key"?:?"age"})
{"values"?:?[20,?35,?60],?"ok"?:?1}


3.group

group提供了更加复杂的聚合功能,它跟SQL里边的group by很类似,你需要指定一个group by的key,mongoDB按照这个key的值把collection分成不同的组,经过聚合后每个组都产生一个结果document。

假设我们有一个站点用来跟踪股票价格,从上午10点到下午4点,每隔几分钟就会有最新的股票价格存储进数据库,作为报表程序的一部分,我们想找出过去30天的收盘价,使用group就可以很容易做到。

股票价格的collection里有成千上万条纪录,格式如下:

{"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:39?GMT-400",?"price"?:?4.27}
{"day"?:?"2010/10/03",?"time"?:?"10/3/2010?05:00:23?GMT-400",?"price"?:?4.10}
{"day"?:?"2010/10/06",?"time"?:?"10/6/2010?05:27:58?GMT-400",?"price"?:?4.30}
{"day"?:?"2010/10/04",?"time"?:?"10/4/2010?08:34:50?GMT-400",?"price"?:?4.01}

我们想要的是每天里边最后成交的那个价钱,结果应该是像下边这样

[
{"time"?:?"10/3/2010?05:00:23?GMT-400",?"price"?:?4.10},
{"time"?:?"10/4/2010?11:28:39?GMT-400",?"price"?:?4.27},
{"time"?:?"10/6/2010?05:27:58?GMT-400",?"price"?:?4.30}
]

那么我们就应该按day分组,找到每组里时间戳最新的记录,把它放到结果集里

>?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;
...?  }
...?}}})
读书人网 >其他数据库

热点推荐