ホームページ > バックエンド開発 > PHPチュートリアル > 分析: php mongodb extension を使用する際の注意点_PHP チュートリアル

分析: php mongodb extension を使用する際の注意点_PHP チュートリアル

WBOY
リリース: 2016-07-21 15:06:06
オリジナル
1119 人が閲覧しました

最近、統計計算に PHP の mongo 拡張機能を使用しています。タイムスタンプフィールドはミリ秒単位なので、長さは 13 桁ですが、最初は文字列の形式で保存されます。コードをコピーします

コードは次のとおりです: { "_id" : ObjectId("504eea97e4b023cf38e34039"), "in_ts" : NumberLong("1347349143699"), "log" : { "guid" : "4D1F3079-7507- F4B0-E7AF-5432D5D8 229D"、"p" : "View_Prop_YepPage_Zheng"、"cid" : "11"、"url" : "http://shanghai.haozu.com/rental/broker/n/10481780"、"rfpn" " : "Listing_V2_IndexPage_All"、"サイト" : "haozu"、"エージェント" : "Mozilla/4.0 (互換性; MSIE 6.0; Windows NT 5.1; SV1)"、"スタンプ" : "1347349162159"、"cip" : "116.226 .70.44"、"リファラー" : "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_Zhen g"、"cid" : "11"、"url" : "http://shanghai.haozu.com/rental/broker/n/10481780"、"rfpn" : "Listing_V2_IndexPage_All"、"サイト" : "haozu"、"エージェント" : "Mozilla /4.0 (互換性; 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" "、"プン" : "View_Prop_YepPage_Zheng", "c stparam" : { "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 拡張機能のバグが原因だと思いましたが、少し考えた結果、原因を見つけるのに長い時間がかかりました。ふと型の問題ではないかと思い立ち、マニュアルにTypesが紹介されているので正しい使い方は以下の通りです:


コードをコピー
コードは以下の通りです: $query = array ('log.stamp' => array ( '$gte' => new MongoInt64($time_range['start']), '$lt' => new MongoInt64($time_range[' end'])));
さらに、統計中にデータに MapReduce を使用して、カーソルでタイムアウト例外が発生するのを防ぐために、タイムアウト期間も設定する必要があります


コードをコピーします
コードは次のとおりです:

$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) ),"カウント":合計} ;
}
' );
$this->mongo_db->command ( array ('mapreduce' => $collection_name, 'map' => $map, 'reduce' => $reduce, 'out ' => $tmp_result, 'クエリ' => $query),array('timeout'=>self::MONGO_CURSOR_TIMEOUT) );

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/327638.html技術記事 php を使用した mongo 展でデータ計算を実行します。その中には、最近精確に 1 秒に達したため、長さは 13 ビットですが、時刻は文字列の形式になっています...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート