解析:使用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 相关文章推荐
Windows 下的 PHP-PEAR 安装方法
Nov 20 PHP
php学习笔记 面向对象中[接口]与[多态性]的应用
Jun 16 PHP
PHP的SQL注入过程分析
Jan 06 PHP
php数组相加 array(“a”)+array(“b”)结果还是array(“a”)
Sep 19 PHP
PHP使用DES进行加密与解密的方法详解
Jun 06 PHP
php删除数组元素示例分享
Feb 17 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(七)
Jun 23 PHP
PHP中基本HTTP认证技巧分析
Mar 16 PHP
php基础教程
Aug 26 PHP
Yii2使用swiftmailer发送邮件的方法
May 03 PHP
PHP获取数据库表中的数据插入新的表再原删除数据方法
Oct 12 PHP
php面向对象基础详解【星际争霸游戏案例】
Jan 23 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原创论坛
2006/10/09 PHP
用Json实现PHP与JavaScript间数据交换的方法详解
2013/06/20 PHP
PHP中$_FILES的使用方法及注意事项说明
2014/02/14 PHP
Yii2.0预定义的别名功能小结
2016/07/04 PHP
Laravel网站打开速度优化的方法汇总
2017/07/16 PHP
ThinkPHP开发--使用七牛云储存
2017/09/14 PHP
搜索附近的人PHP实现代码
2018/02/11 PHP
php的lavarel框架中join和orWhere的用法
2020/12/28 PHP
一些技巧性实用js代码小结
2009/10/14 Javascript
js 禁用只读文本框获得焦点时的退格键
2010/04/25 Javascript
jQuery图片的展开和收缩实现代码
2013/04/16 Javascript
node.js中的path.basename方法使用说明
2014/12/09 Javascript
JavaScript数据类型检测代码分享
2015/01/26 Javascript
jQuery实现横向带缓冲的水平运动效果(附demo源码下载)
2016/01/29 Javascript
正则验证小数点后面只能有两位数的方法
2017/02/28 Javascript
详解nodejs微信jssdk后端接口
2017/05/25 NodeJs
JavaScript实现三级联动效果
2017/07/15 Javascript
基于JavaScript+HTML5 实现打地鼠小游戏逻辑流程图文详解(附完整代码)
2017/11/02 Javascript
微信小程序使用toast消息对话框提示用户忘记输入用户名或密码功能【附源码下载】
2017/12/09 Javascript
vue2.0安装style/css loader的方法
2018/03/14 Javascript
JS双向链表实现与使用方法示例(增加一个previous属性实现)
2019/01/31 Javascript
详解vue 组件
2020/06/11 Javascript
原生JS实现无缝轮播图片
2020/06/24 Javascript
Vue文本模糊匹配功能如何实现
2020/07/30 Javascript
如何在vue 中使用柱状图 并自修改配置
2021/01/21 Vue.js
python实现ftp客户端示例分享
2014/02/17 Python
Python for Informatics 第11章 正则表达式(一)
2016/04/21 Python
python如何读写json数据
2018/03/21 Python
使用Python写一个小游戏
2018/04/02 Python
Python字典的核心底层原理讲解
2019/01/24 Python
python+selenium 定位到元素,无法点击的解决方法
2019/01/30 Python
python pandas生成时间列表
2019/06/29 Python
pandas 如何分割字符的实现方法
2019/07/29 Python
政风行风评议心得体会
2014/10/21 职场文书
工程部岗位职责
2015/02/10 职场文书
vue中三级导航的菜单权限控制
2021/03/31 Vue.js