当前位置: 首页 > news >正文

使用php mongodb扩展时比较需要注意的事项

最近在使用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) );

 

 

转载于:https://www.cnblogs.com/xiazh/archive/2012/09/11/2680653.html

相关文章:

  • [转载] 山楂树之恋——07-09
  • 计算硬盘分区使用的大小
  • as3 键盘事件多键同时按下
  • 关于ADSL宽带多重拨号的探究
  • Java-POI读取Excel简单案例
  • 小日记(一)
  • Servlet 读取web.xml文件中的配置参数连接数据库
  • win8 开发之旅(2) --连连看游戏开发 项目错误的总结
  • createNewFile()与createTempFile()的不同
  • 工作第四天之采集资源
  • 网络工作室暑假后第一次培训资料(ADO.NET创建访问数据集)整理
  • uva 548 Tree
  • 详细解释:nginx中ngx_http_rewrite_module模块配置及各个参数含义
  • 地理可视化
  • 指向类成员的指针的用处
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • ECS应用管理最佳实践
  • js中forEach回调同异步问题
  • orm2 中文文档 3.1 模型属性
  • Redux系列x:源码分析
  • select2 取值 遍历 设置默认值
  • SQLServer之创建数据库快照
  • vue脚手架vue-cli
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 给github项目添加CI badge
  • 前端技术周刊 2019-01-14:客户端存储
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 使用agvtool更改app version/build
  • 使用common-codec进行md5加密
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 线上 python http server profile 实践
  • 移动端 h5开发相关内容总结(三)
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • ionic异常记录
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • #1015 : KMP算法
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • (16)UiBot:智能化软件机器人(以头歌抓取课程数据为例)
  • (floyd+补集) poj 3275
  • (多级缓存)多级缓存
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (九)c52学习之旅-定时器
  • (论文阅读11/100)Fast R-CNN
  • (原)Matlab的svmtrain和svmclassify
  • (转)JAVA中的堆栈
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .NET Core 项目指定SDK版本
  • .NET 动态调用WebService + WSE + UsernameToken
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET处理HTTP请求
  • .Net中间语言BeforeFieldInit