解析:使用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 相关文章推荐
FirePHP 推荐一款PHP调试工具
Apr 23 PHP
php中用于检测一个地理IP地址是否可用的代码
Feb 19 PHP
PHP字符串的连接的简单实例
Dec 30 PHP
使用php测试硬盘写入速度示例
Jan 27 PHP
ThinkPHP之R方法实例详解
Jun 20 PHP
2个Codeigniter文件批量上传控制器写法例子
Jul 25 PHP
Laravel框架学习笔记(二)项目实战之模型(Models)
Oct 15 PHP
php实现计数器方法小结
Jan 05 PHP
PHP简单判断手机设备的方法
Aug 23 PHP
thinkphp Apache配置重启Apache1 restart 出错解决办法
Feb 15 PHP
Laravel框架实现的上传图片到七牛功能详解
Sep 06 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
Mar 02 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
基于empty函数的输出详解
2013/06/17 PHP
php数据访问之增删改查操作
2016/05/09 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
基于JQuery的访问WebService的代码(可访问Java[Xfire])
2010/11/19 Javascript
初窥JQuery(二)事件机制(2)
2010/12/06 Javascript
Node.js实战 建立简单的Web服务器
2012/03/08 Javascript
ExtJS实现文件下载的方法实例
2013/11/09 Javascript
JQuery获取表格数据示例代码
2014/05/26 Javascript
使用jQuery.wechat构建微信WEB应用
2014/10/09 Javascript
input输入框鼠标焦点提示信息
2015/03/17 Javascript
详解jquery事件delegate()的使用方法
2016/01/25 Javascript
前端学习笔记style,currentStyle,getComputedStyle的用法与区别
2016/05/28 Javascript
AngularJS自定义指令实现面包屑功能完整实例
2017/05/17 Javascript
Angularjs cookie 操作实例详解
2017/09/27 Javascript
Vue+Vux项目实践完整代码
2017/11/30 Javascript
vue实现点击当前标签高亮效果【推荐】
2018/06/22 Javascript
jQuery 同时获取多个标签的指定内容并储存为数组
2018/11/20 jQuery
D3.js 实现带伸缩时间轴拓扑图的示例代码
2020/01/20 Javascript
[01:32]dota2拉比克至宝(222)
2018/12/20 DOTA
[01:18]PWL开团时刻DAY4——圣剑与抢盾
2020/11/03 DOTA
利用Python循环(包括while&for)各种打印九九乘法表的实例
2017/11/06 Python
关于Django显示时间你应该知道的一些问题
2017/12/25 Python
python 图片去噪的方法示例
2019/07/09 Python
利用python开发app实战的方法
2019/07/09 Python
python读取文件指定行内容实例讲解
2020/03/02 Python
Python运行提示缺少模块问题解决方案
2020/04/02 Python
基于python检查SSL证书到期情况代码实例
2020/04/04 Python
解决Keras 中加入lambda层无法正常载入模型问题
2020/06/16 Python
公司办公室岗位职责
2014/03/19 职场文书
三严三实对照检查材料范文
2014/09/23 职场文书
幼儿园感恩节活动方案2014
2014/10/11 职场文书
客房服务员岗位职责
2015/02/09 职场文书
病假证明模板
2015/06/19 职场文书
2015年乡镇食品安全工作总结
2015/10/22 职场文书
《鲁滨逊漂流记》之六读后感(4篇)
2019/09/29 职场文书
javascript条件式访问属性和箭头函数介绍
2021/11/17 Javascript