解析:使用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) );

(0)

相关推荐

  • PHP连接MongoDB示例代码

    复制代码 代码如下: <?php //这里采用默认连接本机的27017端口,当然你也可以连接远程主机如192.168.0.4:27017,如果端口是27017,端口可以省略 $m = new Mongo(); // 选择comedy数据库,如果以前没该数据库会自动创建,也可以用$m->selectDB("comedy"); $db = $m->comedy; //选择comedy里面的collection集合,相当于RDBMS里面的表,也-可以使用 $collecti

  • 作为PHP程序员应该了解MongoDB的五件事

    2010年应该被人们记住,因为SQL将在这一年死去.这一年关系数据库行将就木,这一年开发者发现他们再不需要长时间辛苦的构造列或者表格来存放数据.2010年将是文档型数据库的起始年.尽管这样的势头已经持续多年,现在才是一个更多,更广泛的文档型数据库出现的年代.从基于云计算的Amazon到Google,大量开源工具,以及随之诞生的CouchDB和MongoDB.那么什么是MongoDB?下面有五件事是PHP开发者应该了解的:1. MongoDB是一个单独的服务器;2. MongoDB是基于文档,而不

  • php对mongodb的扩展(初出茅庐)

    我们的php mongodb也能做mysql.sqlserver能做的几乎所有功能,本文将详细介绍 一.操作符 操作符相信大家肯定都知道了,就是等于.大于.小于.不等于.大于等于.小于等于,但是在mongodb里不能直接使用这些操作符.在mongodb里的操作符是这样表示的: (1) $gt > (大于) (2) $lt < (小于) (3) $gte >= (大于等于) (4) $lt <= (小于等于) (5) $ne != (不等于) (6) $in in (包含) (7)

  • PHP对MongoDB[NoSQL]数据库的操作

    一.MongoDB简介 MongoDB (名称来自"humongous") 是一个可扩展的.高性能.开源.模式自由.面向文档的数据库,集文档数据库.键值对存储和关系型数据库的优点于一身.官方站点:http://www.mongodb.org/,MongoDB特点: •面向文档存储(类JSON数据模式简单而强大)•动态查询•全索引支持,扩展到内部对象和内嵌数组•查询记录分析•快速,就地更新•高效存储二进制大对象 (比如照片和视频)•复制和故障切换支持•Auto-Sharding自动分片支

  • php对mongodb的扩展(小试牛刀)

    今天外面刮着呼呼的大风,能在一个温暖的小屋写着博客也是北漂的一种幸福.好了废话不多说,今天主要说一下php连接.操作mongodb,如果你没有看上两期的内容,不知道如何安装php对mongodb的扩展的话请您返回去看<php对mongodb的扩展(初识如故) >和<php对mongodb的扩展(初出茅庐)> . php 连接mongodb 复制代码 代码如下: try { $mongo = new Mongo("mongodb://username:password@12

  • PHP操作MongoDB时的整数问题及对策说明

    MongoDB本身有两种整数类型,分别是:32位整数和64位整数,但旧版的PHP驱动不管操作系统是32位还是64位,把所有整数都当做32位整数处理,结果导致64位整数被截断.为了在尽可能保持兼容性的前提下解决这个问题,新版PHP驱动加入了mongo.native-long选项,以期在64位操作系统中把整数都当做64位来处理,有兴趣的可参考:64-bit integers in MongoDB. 那么PHP驱动真的完全解决了整数问题么?NO!在处理group操作的时候还有BUG: 为了说明问题,我

  • 在MongoDB中模拟Auto Increment的php代码

    代码大致如下所示: 复制代码 代码如下: <?php function generate_auto_increment_id($namespace, array $option = array()) { $option += array( 'init' => 1, 'step' => 1, ); $instance = new Mongo(); $instance = $instance->selectCollection('_seq', 'seq'); $seq = $insta

  • 深入PHP操作MongoDB的技术总结

    复制代码 代码如下: <?php/*** PHP操作MongoDB学习笔记*///*************************//**   连接MongoDB数据库  **////*************************//格式=>("mongodb://用户名:密码 @地址:端口/默认指定数据库",参数)$conn = new Mongo();//可以简写为//$conn=new Mongo(); #连接本地主机,默认端口.//$conn=new Mong

  • PHP与MongoDB简介|安全|M+PHP应用实例详解

    一.MongoDB简介MongoDB (名称来自"humongous") 是一个可扩展的.高性能.开源.模式自由.面向文档的数据库,集文档数据库.键值对存储和关系型数据库的优点于一身.官方站点:http://www.mongodb.org/,MongoDB特点: •面向文档存储(类JSON数据模式简单而强大)•动态查询•全索引支持,扩展到内部对象和内嵌数组•查询记录分析•快速,就地更新•高效存储二进制大对象 (比如照片和视频)•复制和故障切换支持•Auto-Sharding自动分片支持

  • php对mongodb的扩展(初识如故)

    在博主的威逼之下特为大家进行一下小分享,特此申明博主人品非常淳朴只是威逼,绝对没有利诱. 由于mongodb的相关中文资料较少,之后若有机会继续为大家分享.希望这点小分享能给大家带来收获,言归正传请往下看. 为什么说"初识如故"呢,因为mongodb的数据存储格式是一种由于MongoDB的文档结构为BJSON格式(BJSON全称:BinaryJSON),而BJSON格式本身就支持保存二进制格式的数据,因此可以把文件的二进制格式的数据直接保存到MongoDB的文档结构中. MongoDB

随机推荐