MongoDB 统计查询的实现

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做统计。




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值