解析:使用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 相关文章推荐
基于mysql的bbs设计(一)
Oct 09 PHP
一步一步学习PHP(3) php 函数
Feb 15 PHP
php下清空字符串中的HTML标签的代码
Sep 06 PHP
PHP新手用的Insert和Update语句构造类
Mar 31 PHP
19个Android常用工具类汇总
Dec 30 PHP
PHP7.0版本备注
Jul 23 PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
Jul 18 PHP
给大家分享几个常用的PHP函数
Jan 15 PHP
php实现批量上传数据到数据库(.csv格式)的案例
Jun 18 PHP
实例讲解YII2中多表关联的使用方法
Jul 21 PHP
Laravel 5.4.36中session没有保存成功问题的解决
Feb 19 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
Oct 17 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权限分配的实现代码
2013/04/28 PHP
php判断GIF图片是否为动画的方法
2020/09/04 PHP
微信自定义菜单的处理开发示例
2015/04/16 PHP
twig里使用js变量的方法
2016/02/05 PHP
如何判断php mysqli扩展类是否开启
2016/12/24 PHP
thinkphp框架实现路由重定义简化url访问地址的方法分析
2020/04/04 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
JavaScript中的关键字"VAR"使用详解 分享
2013/07/31 Javascript
基于jQuery实现的文字按钮表单特效整理
2014/12/07 Javascript
jquery仿百度经验滑动切换浏览效果
2015/04/14 Javascript
javascript操作表格排序实例分析
2015/05/06 Javascript
JavaScript的面向对象编程基础
2015/08/13 Javascript
详解AngularJS控制器的使用
2016/03/09 Javascript
常用的js方法合集
2017/03/10 Javascript
vue2 router 动态传参,多个参数的实例
2017/11/10 Javascript
微信小程序中上传图片并进行压缩的实现代码
2018/08/28 Javascript
JavaScript中的几种继承方法示例
2020/12/06 Javascript
[42:39]老党炸弹人试玩视频
2014/09/03 DOTA
python中函数默认值使用注意点详解
2016/06/01 Python
Python中import导入上一级目录模块及循环import问题的解决
2016/06/04 Python
python使用筛选法计算小于给定数字的所有素数
2018/03/19 Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
2018/11/14 Python
python tools实现视频的每一帧提取并保存
2020/03/20 Python
Python 常用模块 re 使用方法详解
2019/06/06 Python
Python 窗体(tkinter)按钮 位置实例
2019/06/13 Python
django queryset 去重 .distinct()说明
2020/05/19 Python
python Socket网络编程实现C/S模式和P2P
2020/06/22 Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
2020/10/21 Python
python 实现倒计时功能(gui界面)
2020/11/11 Python
Ibatis如何使用动态表名
2015/07/12 面试题
环境科学专业研究生求职信
2013/10/02 职场文书
开展党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
2015年实习单位评语
2015/03/25 职场文书
质检员工作总结2015
2015/04/25 职场文书
飞屋环游记观后感
2015/06/08 职场文书
分析MySQL优化 index merge 后引起的死锁
2022/04/19 MySQL