db.astpool.ensureIndex({"gdate":-1})
问题:作为一个MongoDB新手,要对每天的数据进行统计产生一个统计报表
这里提到了一些统计框架的介绍,我将对这些做些测试,是否满足需求!
结果第一条记录的测试就是失败的:
db.runCommand({aggregate:"astpool",pipeline:[{$match:{mobsdate:"}}]})
{ "result" : [ ], "ok" : 1 }
或者
db.runCommand({aggregate:"astpool",pipeline:[{$match:{mobsdate:{$gt:ISODate("2013-10-12")}}}]})
{
"errmsg" : "exception: can't create Value of BSON type BinaryData",
"code" : 16002,
"ok" : 0
}
算了继续查找其他解决方案,有distinct命令,可以列出指定字段的所有内容:
db.astpool.distinct("mobsdate")
[ ISODate("2013-10-26T13:58:27Z"),
ISODate("2013-10-26T13:59:53Z"),
ISODate("2013-10-26T14:01:19Z"),
ISODate("2013-10-26T14:02:44Z"),
ISODate("2013-10-28T19:35:13Z"),
ISODate("2013-10-28T19:36:39Z"),
ISODate("2013-10-28T19:38:05Z"),
ISODate("2013-10-28T19:39:31Z"),
ISODate("2013-10-28T19:40:57Z")
]
虽然列出了所有的内容,但是并没有统计数量。而group可以实现该目标。参考这里
看完了例子我才发现在我的数据中并没有一个字段标记某一天,只有mobsdate字段记录了日期和时间,group的查询统计挺复杂的,直接增加查询条件后用count()反而简单。至少我目前是这么认为的。在这里有些介绍group,find,count等函数的使用。从例子中发现,必须把mobsdate字段拆为:date和time两个字段,分别表示日期和时间。这样会便于group的操作。于是我需要对之前的数据做添加date和time。
于是修改修改文档入库程序,提取日期部分
//在store.php入库文件中做以下修改
//修改时区报错
date_default_timezone_set('Asia/Shanghai');
//提取日期部分
$gdate=date("Y-m-d",$obsdate);
//在入库数组中增加一个字段
"gdate"=>$gdate
以后的入库文档都有了date字段,但是之前的文档如何添加呢?
$multip =array('multiple'=>true);
for($i=1;$i<=30;$i++)
{
$j=$i+1;
$date0="2013-10-30T08:00:00";
$gdate=date("Y-m-d",strtotime($date0." -$j day"));
$date1=new Mongodate(strtotime($date0."-$i day"));
$date2=new Mongodate(strtotime($date0."-$j day"));
$quer=array("mobsdate"=>array('$gt'=> $date2,'$lt'=> $date1));
$setdate=array('$set'=>array("gdate"=>$gdate));
echo $gdate."\n";
$img=$db->astpool->update($quer,$setdate,$multip);
echo $img."\n";
}
一个循环批量修改了30天数据,数据库也就刚建好,20万条的修改很快。
在mongo的shell下查询
db.astpool.count({gdate:"2013-10-28"})
和对mobsdate字段的查询结果是一样的,但是速度特别慢,这是没有对gdate字段添加索引的缘故:
db.astpool.ensureIndex({"gdate":-1})
对gdate做逆序索引。一些都准备好了,开始group做统计。