解析:使用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优化的8条经验
Mar 24 PHP
有关 PHP 和 MySQL 时区的一点总结
Mar 26 PHP
php垃圾代码优化操作代码
Aug 05 PHP
php 生成文字png图片的代码
Apr 17 PHP
PHP简洁函数小结
Aug 12 PHP
php之XML转数组函数的详解
Jun 07 PHP
解析php多线程下载远程多个文件
Jun 25 PHP
php5.2 Json不能正确处理中文、GB编码的解决方法
Mar 28 PHP
php使用正则表达式提取字符串中尖括号、小括号、中括号、大括号中的字符串
Apr 05 PHP
PHP中array_map与array_column之间的关系分析
Aug 19 PHP
PHP调试及性能分析工具Xdebug详解
Feb 09 PHP
php生成二维码不保存服务器还有下载功能的实现代码
Aug 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
SSI指令
2006/11/25 PHP
Adodb的十个实例(清晰版)
2006/12/31 PHP
php的常量和变量实例详解
2017/06/27 PHP
PHP实现简单日历类编写
2020/08/28 PHP
Docker 安装 PHP并与Nginx的部署实例讲解
2021/02/27 PHP
Javascript 原型和继承(Prototypes and Inheritance)
2009/04/01 Javascript
写入cookie的JavaScript代码库 cookieLibrary.js
2009/10/24 Javascript
热点新闻滚动特效的js代码
2013/08/17 Javascript
手机平板等移动端适配跳转URL的js代码
2014/01/25 Javascript
node.js中的console.log方法使用说明
2014/12/09 Javascript
javascript自动生成包含数字与字符的随机字符串
2015/02/09 Javascript
jQuery焦点控制图层展示延迟隐藏的方法
2015/03/09 Javascript
JS实现点击事件统计的简单实例
2016/07/10 Javascript
JavaScript职责链模式概述
2016/09/17 Javascript
JS中常用的正则表达式
2016/09/29 Javascript
利用js来实现缩略语列表、文献来源链接和快捷键列表
2016/12/16 Javascript
XMLHttpRequest对象_Ajax异步请求重点(推荐)
2017/09/28 Javascript
vue以组件或者插件的形式实现throttle或者debounce
2019/05/22 Javascript
使用npm命令提示: 'npm' 不是内部或外部命令,也不是可运行的程序的处理方法
2020/05/14 Javascript
[05:15]DOTA2英雄梦之声_第16期_灰烬之灵
2014/06/21 DOTA
[01:07:17]EG vs Optic Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
详解Python list 与 NumPy.ndarry 切片之间的对比
2017/07/24 Python
Python编程快速上手——Excel表格创建乘法表案例分析
2020/02/28 Python
利用Python实现Excel的文件间的数据匹配功能
2020/06/16 Python
python/golang 删除链表中的元素
2020/09/14 Python
HTML5自定义属性前缀data-及dataset的使用方法(html5 新特性)
2017/08/24 HTML / CSS
linux面试题参考答案(6)
2014/08/29 面试题
自荐信的禁忌和要点
2013/10/15 职场文书
公司董事长职责
2013/12/12 职场文书
小学数学教研活动总结
2014/07/01 职场文书
做一个有道德的人活动实施方案
2014/08/23 职场文书
防邪知识进家庭活动方案
2014/08/26 职场文书
重阳节演讲稿:尊敬帮助老人 弘扬传统美德
2014/09/25 职场文书
工作失职造成投诉的检讨书范文
2014/10/05 职场文书
python使用glob检索文件的操作
2021/05/20 Python
python 判断文件或文件夹是否存在
2022/03/18 Python