解析:使用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 array_multisort函数 对数据库结果进行复杂排序
Jun 08 PHP
解析php中反射的应用
Jun 18 PHP
php数组合并的二种方法
Mar 21 PHP
完美解决thinkphp验证码出错无法显示的方法
Dec 09 PHP
PHP中大于2038年时间戳的问题处理方案
Mar 03 PHP
PHP实现在线阅读PDF文件的方法
Jun 17 PHP
WordPress中对访客评论功能的一些优化方法
Nov 24 PHP
PHP中set_include_path()函数相关用法分析
Jul 18 PHP
php禁用函数设置及查看方法详解
Jul 25 PHP
详解PHP中websocket的使用方法
Sep 15 PHP
PHP文件操作详解
Dec 30 PHP
php实现的二分查找算法示例
Jun 20 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 操作excel文件的方法小结
2009/12/31 PHP
php目录操作函数之获取目录与文件的类型
2010/12/29 PHP
适用于php-5.2 的 php.ini 中文版[金步国翻译]
2011/04/17 PHP
浅析十款PHP开发框架的对比
2013/07/05 PHP
php操作xml入门之xml基本介绍及xml标签元素
2015/01/23 PHP
项目中应用Redis+Php的场景
2016/05/22 PHP
thinkPHP5.0框架引入Traits功能实例分析
2017/03/18 PHP
jquery获取元素值的方法(常见的表单元素)
2013/11/15 Javascript
JS获得QQ号码的昵称,头像,生日的简单实例
2013/12/04 Javascript
javascripit实现密码强度检测代码分享
2013/12/12 Javascript
JavaScript中字符串拼接的基本方法
2015/07/07 Javascript
详解JavaScript语言的基本语法要求
2015/11/20 Javascript
JS实现环形进度条(从0到100%)效果
2016/07/05 Javascript
浅谈angularJS中的事件
2016/07/12 Javascript
JS取数字小数点后两位或n位的简单方法
2016/10/24 Javascript
Bootstrap CSS组件之按钮下拉菜单
2016/12/17 Javascript
解决拦截器对ajax请求的拦截实例详解
2016/12/21 Javascript
iscroll.js滚动加载实例详解
2017/07/18 Javascript
小程序实现上下移动切换位置
2019/09/23 Javascript
在博客园博文中添加自定义右键菜单的方法详解
2020/02/05 Javascript
vue更改数组中的值实例代码详解
2020/02/07 Javascript
浅谈vue项目利用Hbuilder打包成APP流程,以及遇到的坑
2020/09/12 Javascript
python实现爬虫下载漫画示例
2014/02/16 Python
python处理csv数据的方法
2015/03/11 Python
Python实现查找系统盘中需要找的字符
2015/07/14 Python
Python中使用asyncio 封装文件读写
2016/09/11 Python
Python通过matplotlib画双层饼图及环形图简单示例
2017/12/15 Python
Python使用字典的嵌套功能详解
2019/02/27 Python
python实现简单颜色识别程序
2020/02/19 Python
TensorFlow实现批量归一化操作的示例
2020/04/22 Python
个人求职简历的自我评价
2013/10/19 职场文书
教学个人的自我评价分享
2014/02/16 职场文书
2015年出纳个人工作总结
2015/04/02 职场文书
关于保护环境的建议书
2019/06/24 职场文书
互联网创业商业模式以及赚钱法则有哪些?
2019/10/12 职场文书
Mysql中的触发器定义及语法介绍
2022/06/25 MySQL