解析:使用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的论坛(4)
Oct 09 PHP
php基础知识:类与对象(3) 构造函数和析构函数
Dec 13 PHP
PHP面向对象概念
Nov 06 PHP
PHP函数篇之掌握ord()与chr()函数应用
Dec 05 PHP
php与Mysql的一些简单的操作
Feb 26 PHP
php采集中国代理服务器网的方法
Jun 16 PHP
从性能方面考虑PHP下载远程文件的3种方法
Dec 29 PHP
PHP实现基于3DES算法加密解密字符串示例
Aug 24 PHP
PHP实现通过二维数组键值获取一维键名操作示例
Oct 11 PHP
ThinkPHP5.0框架实现切换数据库的方法分析
Oct 30 PHP
YII2框架中查询生成器Query()的使用方法示例
Mar 18 PHP
Laravel 自动转换长整型雪花 ID 为字符串的实现
Oct 27 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 数组教程 定义数组
2009/10/23 PHP
ThinkPHP之foreach标签使用概述
2014/06/30 PHP
PHP临时文件的安全性分析
2014/07/04 PHP
php取得字符串首字母的方法
2015/03/25 PHP
php实现通过ftp上传文件
2015/06/19 PHP
屏蔽PHP默认设置中的Notice警告的方法
2016/05/20 PHP
科讯商业版中用到的ajax空间与分页函数
2007/09/02 Javascript
jQuery ui 1.7更新小结
2009/08/15 Javascript
Javascript 键盘keyCode键码值表
2009/12/24 Javascript
自写的一个jQuery圆角插件
2010/10/26 Javascript
关于JavaScript中var声明变量作用域的推断
2010/12/16 Javascript
分享一个用Mootools写的鼠标滑过进度条改变进度值的实现代码
2011/12/12 Javascript
判断日期是否能跨月查询的js代码
2014/07/25 Javascript
28个常用JavaScript方法集锦
2015/01/14 Javascript
js实现背景图自适应窗口大小
2017/01/10 Javascript
javascript实现下雨效果
2017/03/27 Javascript
基于react后端渲染模板引擎noox发布使用
2018/01/11 Javascript
如何在vue中使用ts的示例代码
2018/02/28 Javascript
webpack v4 从dev到prd的方法
2018/04/02 Javascript
vue自定义filters过滤器
2018/04/26 Javascript
微信小程序显示倒计时功能示例【测试可用】
2018/12/03 Javascript
Element-ui DatePicker显示周数的方法示例
2019/07/19 Javascript
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
element 中 el-menu 组件的无限极循环思路代码详解
2020/04/26 Javascript
[40:05]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第一局
2016/02/25 DOTA
详解K-means算法在Python中的实现
2017/12/05 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
css3一款3D字体带阴影效果的实现步骤
2013/03/20 HTML / CSS
卡骆驰德国官方网站:Crocs德国
2019/03/29 全球购物
摄影实习自我鉴定
2013/09/20 职场文书
师范应届生教师求职信
2013/11/05 职场文书
职工运动会邀请函
2014/01/19 职场文书
幼儿园大班教学反思
2014/02/10 职场文书
人事任命书格式
2014/06/05 职场文书
客户答谢会致辞
2015/01/20 职场文书
Python OpenCV超详细讲解调整大小与图像操作的实现
2022/04/02 Python