解析:使用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 相关文章推荐
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安装配置图文教程 2009年
Jun 08 PHP
使用dump函数,给php加断点测试
Jun 25 PHP
九个你必须知道而且又很好用的php函数和特点
Aug 08 PHP
PHPMailer的主要功能特点和简单使用说明
Feb 17 PHP
getJSON跨域SyntaxError问题分析
Aug 07 PHP
C#静态方法与非静态方法实例分析
Sep 22 PHP
Apache启动报错No space left on device: AH00023该怎么解决
Oct 16 PHP
PHP代码维护,重构变困难的4种原因分析
Jan 25 PHP
Zend Framework实现自定义过滤器的方法
Dec 09 PHP
laravel 根据不同组织加载不同视图的实现
Oct 14 PHP
php ActiveMQ的安装与使用方法图文教程
Feb 23 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
Nov 10 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
如何给phpadmin一个保护
2006/10/09 PHP
PHP 得到根目录的 __FILE__ 常量
2008/07/23 PHP
Php图像处理类代码分享
2012/01/19 PHP
thinkPHP中volist标签用法示例
2016/12/06 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
2017/03/25 PHP
thinkphp5.1 框架钩子和行为用法实例分析
2020/05/25 PHP
js控制表单操作的常用代码小结
2013/08/15 Javascript
jQuery及JS实现循环中暂停的方法
2015/02/02 Javascript
JavaScript图像延迟加载库Echo.js
2016/04/05 Javascript
基于javascript实现最简单选项卡切换
2017/02/01 Javascript
微信小程序checkbox组件使用详解
2018/01/31 Javascript
Nodejs模块载入运行原理
2018/02/23 NodeJs
简单的React SSR服务器渲染实现
2018/12/11 Javascript
vue双向绑定及观察者模式详解
2019/03/19 Javascript
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
2019/04/01 Javascript
vue-cli3.X快速创建项目的方法步骤
2019/11/14 Javascript
JS array数组检测方式解析
2020/05/19 Javascript
在Python 3中实现类型检查器的简单方法
2015/07/03 Python
Python简单实现socket信息发送与监听功能示例
2018/01/03 Python
基于Python Numpy的数组array和矩阵matrix详解
2018/04/04 Python
python安装模块如何通过setup.py安装(超简单)
2018/05/05 Python
python3将视频流保存为本地视频文件
2018/06/20 Python
利用python如何实现猫捉老鼠小游戏
2020/12/04 Python
html5的pushstate以及监听浏览器返回事件的实现
2020/08/11 HTML / CSS
HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题
2021/01/19 HTML / CSS
德国箱包网上商店:koffer24.de
2016/07/27 全球购物
乌克兰移动电子产品和相关配件的在线商店:iTMag
2020/03/16 全球购物
四年的大学生生活自我评价
2013/12/09 职场文书
《圆明园的毁灭》教学反思
2014/02/28 职场文书
晚会主持词开场白
2014/03/17 职场文书
2014年创先争优活动总结
2014/05/04 职场文书
群众路线教育实践活动剖析材料
2014/09/30 职场文书
婚礼庆典答谢词
2015/01/20 职场文书
个人自荐书怎么写
2015/03/26 职场文书
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
2021/08/23 MySQL
python区块链持久化和命令行接口实现简版
2022/05/25 Python