解析:使用php mongodb扩展时 需要注意的事项


Posted in PHP onJune 18, 2013

最近在使用php的mongo 扩展进行数据统计计算,其中有一个时间戳字段,由于精确到了毫秒,长度有13位,但由于开始的时候是以字符串的形式存储:

{ "_id" : ObjectId("504eea97e4b023cf38e34039"), "in_ts" : NumberLong("1347349143699"), "log" : { "guid" : "4D1F3079-7507-F4B0-E7AF-5432D5D8229D", "p" : "View_Prop_YepPage_Zheng", "cid" : "11", "url" : "http://shanghai.haozu.com/rental/broker/n/10481780", "rfpn" : "Listing_V2_IndexPage_All", "site" : "haozu", "agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)", "stamp" : "1347349162159", "cip" : "116.226.70.44", "referer" : "http://shanghai.haozu.com/shop/1464934/", "cstamp" : "1347349323125", "sessid" : "FA798056-F9E7-F961-41E0-CC95C850FA47", "uguid" : "C00FF55B-3D3D-4B31-4318-12345B0DBE64", "pn" : "View_Prop_YepPage_Zheng", "cstparam" : { "proId" : NumberLong(10481780), "brokerId" : "326792", "tradeType" : "2", "userType" : "0", "channel" : "site", "entry" : "1", "COMMID" : "1666" } }, "out_ts" : NumberLong("1347349466083"), "rule" : 0, "status" : "ok", "txid" : 0 }

后来改成数字格式:
{ "_id" : ObjectId("504eea97e4b023cf38e34039"), "in_ts" : NumberLong("1347349143699"), "log" : { "guid" : "4D1F3079-7507-F4B0-E7AF-5432D5D8229D", "p" : "View_Prop_YepPage_Zheng", "cid" : "11", "url" : "http://shanghai.haozu.com/rental/broker/n/10481780", "rfpn" : "Listing_V2_IndexPage_All", "site" : "haozu", "agent" : "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)", "stamp" : NumberLong("1347349162159"), "cip" : "116.226.70.44", "referer" : "http://shanghai.haozu.com/shop/1464934/", "cstamp" : "1347349323125", "sessid" : "FA798056-F9E7-F961-41E0-CC95C850FA47", "uguid" : "C00FF55B-3D3D-4B31-4318-12345B0DBE64", "pn" : "View_Prop_YepPage_Zheng", "cstparam" : { "proId" : NumberLong(10481780), "brokerId" : "326792", "tradeType" : "2", "userType" : "0", "channel" : "site", "entry" : "1", "COMMID" : "1666" } }, "out_ts" : NumberLong("1347349466083"), "rule" : 0, "status" : "ok", "txid" : 0 }

为字符串时,使用下面的查询是正常的
$query = array ('log.stamp' => array ('$gte' => ‘1347346800000', '$lt' => ‘1347350400000'));

但是改为数字后,使用下面的查询,死活没有结果,但是直接在mongo客户端直接查询是有结果的:
db.haozu_success.find({'log.stamp':{$gte:1347346800000,$lt:1347350400000}})

php手册上也是这么个用法:
$query = array ('log.stamp' => array ('$gte' => 1347346800000, '$lt' => 1347350400000));

花了好大一会找原因,开始时怀疑是php扩展的bug导致,经过一番思考。突然想到可能是类型问题导致,发现手册上有Types 介绍,所以正确的用法如下:
$query = array ('log.stamp' => array ('$gte' => new MongoInt64($time_range['start']), '$lt' => new MongoInt64($time_range['end'])));

另外,在使用mapreduce进行数据统计时,为了防止cursor出现超时异常,还需要设置一下超时时间
$map = new MongoCode ( '
                function(){
                    var prop_id=this.log.cstparam.proId;
                    var key=this.log.site+prop_id
                    emit(key,{"channel":this.log.site,"prop_id":prop_id,"count":1});
                }
                ' );
        $reduce = new MongoCode ( '
                function(key,emits){
                    var total=0;
                    for(var i in emits){
                        total+=emits[i].count;
                    }
                    return {"channel":emits[0].channel,"prop_id":eval(emits[0].prop_id),"count":total};
                }
                ' );
$this->mongo_db->command ( array ('mapreduce' => $collection_name, 'map' => $map, 'reduce' => $reduce, 'out' => $tmp_result, 'query' => $query),array('timeout'=>self::MONGO_CURSOR_TIMEOUT) );

PHP 相关文章推荐
完美解决dedecms中的[html][/html]和[code][/code]问题
Mar 20 PHP
PHP执行批量mysql语句的解决方法
May 02 PHP
探讨:php中在foreach中使用foreach ($arr as &$value) 这种类型的解释
Jun 24 PHP
解析PHP实现下载文件的两种方法
Jul 05 PHP
PHP中func_get_args(),func_get_arg(),func_num_args()的区别
Sep 30 PHP
ThinkPHP缓存方法S()概述
Jun 13 PHP
CI框架整合widget(页面格局)的方法
May 17 PHP
php mysql获取表字段名称和字段信息的三种方法
Nov 13 PHP
Yii框架实现图片上传的方法详解
May 20 PHP
php 二维数组快速排序算法的实现代码
Oct 17 PHP
解决php扩展安装不生效问题
Oct 25 PHP
PHP高并发和大流量解决方案整理
Mar 09 PHP
解析:通过php socket并借助telnet实现简单的聊天程序
Jun 18 #PHP
浅析is_writable的php实现
Jun 18 #PHP
解析mysql left( right ) join使用on与where筛选的差异
Jun 18 #PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
Jun 18 #PHP
编译php 5.2.14+fpm+memcached(具体操作详解)
Jun 18 #PHP
解析PHP实现多进程并行执行脚本
Jun 18 #PHP
PHP实现多进程并行操作的详解(可做守护进程)
Jun 18 #PHP
You might like
php无序树实现方法
2015/07/28 PHP
thinkphp集成前端脚手架Vue-cli的教程图解
2018/08/30 PHP
PHP单例模式实例分析【防继承,防克隆操作】
2019/05/22 PHP
在 IE 中调用 javascript 打开 Excel 表
2006/12/21 Javascript
jquery实现控制表格行高亮实例
2013/06/05 Javascript
js中arguments,caller,callee,apply的用法小结
2014/01/28 Javascript
JavaScript函数模式详解
2014/11/07 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
2015/11/25 Javascript
javascript事件绑定学习要点
2016/03/09 Javascript
js改变style样式和css样式的简单实例
2016/06/28 Javascript
javascript中this用法实例详解
2017/04/06 Javascript
详解开源的JavaScript插件化框架MinimaJS
2017/10/26 Javascript
JS实现监控微信小程序的原理
2018/06/15 Javascript
微信小程序使用蓝牙小插件
2019/09/23 Javascript
微信小程序激励式视频广告组件使用详解
2019/12/06 Javascript
[51:29]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第一场 11.05
2020/11/05 DOTA
在Python中使用poplib模块收取邮件的教程
2015/04/29 Python
解读Python中degrees()方法的使用
2015/05/18 Python
深入学习python的yield和generator
2016/03/10 Python
Python+opencv 实现图片文字的分割的方法示例
2019/07/04 Python
django 使用 PIL 压缩图片的例子
2019/08/16 Python
详解在python操作数据库中游标的使用方法
2019/11/12 Python
基于python生成英文版词云图代码实例
2020/05/16 Python
Java爬虫技术框架之Heritrix框架详解
2020/07/22 Python
基于OpenCV的路面质量检测的实现
2020/11/04 Python
洛杉矶时尚女装系列:J.ING US
2019/03/17 全球购物
Guess欧洲官网:美国服饰品牌
2019/08/06 全球购物
Booking.com缤客中国:全球酒店在线预订网站
2020/05/03 全球购物
物流管理应届生求职信
2013/11/07 职场文书
应届大学生的推荐信
2013/11/20 职场文书
简历中自我评价怎么写
2014/02/12 职场文书
兴趣小组活动总结
2014/05/05 职场文书
汽车广告策划方案
2014/05/31 职场文书
教师政风行风评议心得体会
2014/10/21 职场文书
八达岭长城导游词
2015/01/30 职场文书
2015年学校教务处工作总结
2015/05/11 职场文书