解析:使用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 相关文章推荐
让PHP支持页面回退的两种方法
Jan 10 PHP
PHP 采集获取指定网址的内容
Jan 05 PHP
php更改目录及子目录下所有的文件后缀扩展名的代码
Oct 12 PHP
php中echo()和print()、require()和include()等易混淆函数的区别
Feb 22 PHP
8个PHP程序员常用的功能汇总
Dec 18 PHP
wordpress安装过程中遇到中文乱码的处理方法
Apr 21 PHP
php通过curl模拟登陆DZ论坛
May 11 PHP
摘自织梦CMS中的图片处理类
Aug 08 PHP
php metaphone()函数及php localeconv() 函数实例解析
May 15 PHP
thinkPHP多语言切换设置方法详解
Nov 11 PHP
PHP 进度条函数的简单实例
Sep 19 PHP
php+ajax实现商品对比功能示例
Apr 13 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 OPCode缓存 APC详细介绍
2010/10/12 PHP
PHP mail()函数使用及配置方法
2014/01/14 PHP
微信支付开发发货通知实例
2016/07/12 PHP
javascript之对系统的toFixed()方法的修正
2007/05/08 Javascript
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
2013/09/29 Javascript
深入领悟JavaScript中的面向对象
2013/11/18 Javascript
基于promise.js实现nodejs的promises库
2014/07/06 NodeJs
js获取checkbox复选框选中的选项实例
2014/08/24 Javascript
玩转JavaScript OOP - 类的实现详解
2016/06/08 Javascript
js实现带缓动动画的导航栏效果
2017/01/16 Javascript
JavaScript常用正则函数用法示例
2017/01/23 Javascript
判断颜色是否合法的正则表达式(详解)
2017/05/03 Javascript
BootStrap中的Fontawesome 图标
2017/05/25 Javascript
jQuery实现动态删除LI的方法
2017/05/30 jQuery
JavaScript全屏和退出全屏事件总结(附代码)
2017/08/17 Javascript
教你如何用node连接redis的示例代码
2018/07/12 Javascript
小程序实现列表点赞功能
2018/11/02 Javascript
浅析Proxy可以优化vue的数据监听机制问题及实现思路
2018/11/29 Javascript
Vue2.x Todo之自定义指令实现自动聚焦的方法
2019/01/08 Javascript
JavaScript强制类型转换和隐式类型转换操作示例
2019/05/01 Javascript
jquery 时间戳转日期过程详解
2019/10/12 jQuery
解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)
2020/11/11 Javascript
vue实现简易的双向数据绑定
2020/12/29 Vue.js
Python中的默认参数详解
2015/06/24 Python
详解Python 爬取13个旅游城市,告诉你五一大家最爱去哪玩?
2019/05/07 Python
Ubuntu16.04安装python3.6.5步骤详解
2020/01/10 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
2021/01/27 Python
利用Opencv实现图片的油画特效实例
2021/02/28 Python
联想美国官方商城:Lenovo美国
2017/06/19 全球购物
Foot Locker德国官方网站:美国运动服和鞋类零售商
2018/11/01 全球购物
英国美发和美容产品商城:HQhair
2019/02/08 全球购物
Jowissa官方网站:瑞士制造的手表,优雅简约的设计
2020/07/29 全球购物
人力资源管理专业应届生求职信
2013/09/28 职场文书
申报优秀教师材料
2014/12/16 职场文书
交通事故起诉书
2015/05/19 职场文书
法定代表人身份证明书
2015/06/18 职场文书