解析:使用php mongodb扩展时 需要注意的事项

 更新时间:2013年06月18日 11:19:22   作者:  
本篇文章是对使用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) );

相关文章

  • 使用PHP把HTML生成PDF文件的几个开源项目介绍

    使用PHP把HTML生成PDF文件的几个开源项目介绍

    这篇文章主要介绍了使用PHP把HTML生成PDF文件的几个开源项目介绍,本文罗列了FPDF、DomPDF、TCPDF等项目的特点,需要的朋友可以参考下
    2014-11-11
  • php中文字符串截取方法实例总结

    php中文字符串截取方法实例总结

    这篇文章主要介绍了php中文字符串截取方法实例,针对常见的字符串截取函数进行了分析比对,并给出了一个完整实例来解决PHP中文字符串截取问题,需要的朋友可以参考下
    2014-09-09
  • Php图像处理类代码分享

    Php图像处理类代码分享

    一个php图片处理类,和网上的存在的不同,该类只有一个公共方法,通过在实例化对象的时候给$type参数传不同的值,从而实现不同功能
    2012-01-01
  • PHP代码优化技巧小结

    PHP代码优化技巧小结

    我们在编写程序时,想要使自己的程序占用资源最小,运行速度更快,代码量更少。PHP独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法,它可以比 CGI或者Perl更快速的执行动态网页。PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成HTML标记的CGI要高得多。
    2015-09-09
  • PHP之十六个魔术方法详细介绍

    PHP之十六个魔术方法详细介绍

    PHP中把以两个下划线__开头的方法称为魔术方法(Magic methods),这些方法在PHP中充当了举足轻重的作用。这里进行详细介绍,感兴趣的小伙伴们可以参考一下。
    2016-11-11
  • php获取用户IPv4或IPv6地址的代码

    php获取用户IPv4或IPv6地址的代码

    谷歌了一下,找到这段代码,可以根据用户环境获取IP地址,需要的朋友可以参考下
    2012-11-11
  • 通达OA公共代码 php常用检测函数

    通达OA公共代码 php常用检测函数

    从通达OA公共代码扒下的php常用检测函数代码,学习php的朋友可以参考下。
    2011-12-12
  • 详细解读PHP中接口的应用

    详细解读PHP中接口的应用

    这篇文章主要介绍了PHP中接口的应用,是PHP入门学习中的基础知识,需要的朋友可以参考下
    2015-08-08
  • php常用表单验证类用法实例

    php常用表单验证类用法实例

    这篇文章主要介绍了php常用表单验证类用法,实例分析了php针对表单元素常用验证技巧,需要的朋友可以参考下
    2015-06-06
  • php实现的PDO异常处理操作分析

    php实现的PDO异常处理操作分析

    这篇文章主要介绍了php实现的PDO异常处理操作,结合实例形式分析了pdo异常处理的相关原理、用法及操作注意事项,需要的朋友可以参考下
    2018-12-12

最新评论