最新公告
  • 欢迎您光临波比源码,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 使用php mongodb扩展时比较需要注意的事项

    最近在使用php的mongo 扩展进行数据统计计算,其中有一个时间戳字段,由于精确到了毫秒,长度有13位,但由于开始的时候是以字符串的形式存储:

    最近在使用php的mongo 扩展进行数据统计计算,其中有一个时间戳字段,由于精确到了毫秒,长度有13位,但由于开始的时候是以字符串的形式存储:

    实例代码如下:

    1. "_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 } 

    后来改成数字格式:

    实例代码如下:

    1. "_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 }为字符串时,使用下面的查询是正常的 
    2.         $query = array ('log.stamp' => array ('$gte' => ‘1347346800000’, '$lt' => ‘1347350400000’)); 

    但是改为数字后,使用下面的查询,死活没有结果,但是直接在mongo客户端直接查询是有结果的:

    实例代码如下:

    1. "_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 }为字符串时,使用下面的查询是正常的 
    2.         $query = array ('log.stamp' => array ('$gte' => ‘1347346800000’, '$lt' => ‘1347350400000’)); 

    实例代码如下:

    1. db.haozu_success.find({'log.stamp':{$gte:1347346800000,$lt:1347350400000}}) 

    php手册上也是这么个用法:

     
    1. $query = array ('log.stamp' => array ('$gte' => 1347346800000, '$lt' => 1347350400000)); 

    花了好大一会找原因,开始时怀疑是php扩展的bug导致,经过一番思考.突然想到可能是类型问题导致,发现手册上有Types 介绍,所以正确的用法如下:

    实例代码如下:

    1. $query = array ('log.stamp' => array ('$gte' => new MongoInt64($time_range['start']), '$lt' => new MongoInt64($time_range['end']))); 

    另外,在使用mapreduce进行数据统计时,为了防止cursor出现超时异常,还需要设置一下超时时间

    实例代码如下:

    1. $map = new MongoCode ( ' 
    2.                 function(){ 
    3.                     var prop_id=this.log.cstparam.proId; 
    4.                     var key=this.log.site+prop_id 
    5.                     emit(key,{"channel":this.log.site,"prop_id":prop_id,"count":1}); 
    6.                 } 
    7.                 ' ); 
    8.         $reduce = new MongoCode ( ' 
    9.                 function(key,emits){ 
    10.                     var total=0; 
    11.                     for(var i in emits){ 
    12.                         total+=emits[i].count
    13.                     } 
    14.                     return {"channel":emits[0].channel,"prop_id":eval(emits[0].prop_id),"count":total}; 
    15.                 } 
    16.                 ' ); 
    17. $this->mongo_db->command ( array ('mapreduce' => $collection_name'map' => $map'reduce' => $reduce'out' => $tmp_result'query' => $query),array('timeout'=>self::MONGO_CURSOR_TIMEOUT) ); 
    波比源码 – 精品源码模版分享 | www.bobi11.com
    1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
    2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
    3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
    4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
    5. 如有链接无法下载、失效或广告,请联系管理员处理!
    6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
    7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

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

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    波比源码
    一个高级程序员模板开发平台
    升级波友尊享更多特权立即升级