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

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

WBOY
WBOYオリジナル
2016-07-13 17:14:02878ブラウズ

最近、PHPのmongo拡張機能を使用して統計計算を実行しています。タイムスタンプフィールドはミリ秒単位の精度であるため、長さは13桁ですが、先頭は文字列の形式で保存されます。 :

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


{ "_id" : ObjectId("504eea97e4b023cf38e34039"), "in_ts" : NumberLong("1347349143699"), "log" : { "guid" : "4D1F3079-7507-F4B0-E7AF-5432D5D8229D", "p" : "ビュー_小道具_ YepPage_Zheng "、"cid" : "11"、"url" : "http://shanghai.haozu.com/rental/broker/n/10481780"、"rfpn" : "Listing_V2_IndexPage_All"、"site" : "haozu" 、「エージェント」:「Mozilla/4.0(互換性; MSIE 6.0; Windows NT 5.1; SV1)」、「スタンプ」:「1347349162159」、「cip」:「116.226.70.44」、「リファラー」:「http://上海 .haozu.com/shop/1464934/"、"cstamp" : "1347349323125"、"sessid" : "FA798056-F9E7-F961-41E0-CC95C850FA47"、"uguid" : "C00FF55B-3D3D-4B31-4318-12" 345B0DBE6 4" 、 "pn" : "View_Prop_YepPage_Zheng"、 "cstparam" : { "proId" : NumberLong(10481780)、 "brokerId" : "326792"、 "tradeType" : "2"、 "userType" : "0"、"チャンネル" : "サイト", "エントリ" : "1", "COMMID" : "1666" } }, "out_ts" : NumberLong("1347349466083"), "ルール" : 0, "ステータス" : "ok", "txid " : 0 }

後にデジタル形式に変更されました:

しかし、次のクエリを使用して数値に変更した後、結果はありませんが、mongo クライアントでの直接クエリでは結果が得られます:

コードは次のとおりです コードをコピー
"{" _Id ": Objectid (" 504EEA97E4B023CF38E34039 ")、" In_TS ": Numberlong (" 1347349143699 ")、" LOG ": {" GUID " 2d5d8229d "、" 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 SV1)"、"スタンプ" : NumberLong("1347349162159")、"リファラー" : "http://shanghai.haozu.com/shop /1464934/"、"cstamp" : "1347349323125"、"sessid" : "FA798056-F9E7-F961-41E0-CC95C850FA47"、"uguid" : "C00FF55B-3D3D-4B31- 4318-12345B0DBE64"、"ぷん" : " View_Prop_YepPage_Zheng", "cstparam" : { "proId" : NumberLong(10481780), "brokerId" : "326792", "tradeType" : "2", "userType" : "0" 、 "channel" : "site", "エントリ" : "1", "COMMID" : "1666" } }, "out_ts" : NumberLong("1347349466083"), "rule" : 0, "status" : "ok ", "txid" : 0 } は文字列、次のクエリを使用するのが通常です

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

コードは次のとおりです コードをコピー
db.haozu_success.find({'log.stamp':{$gte:1347346800000,$lt:1347350400000}})

これは PHP マニュアルでも次のように使用されます:

コードは次のとおりです コードをコピー
$query = array ('log.stamp' => array ('$gte' => 1347346800000, '$lt' => 1347350400000));

最初は、PHP 拡張機能のバグが原因ではないかと思いましたが、少し考えた結果、それが原因だと思いました。ふと、型の問題ではないかと思い立ち、マニュアルに型の紹介があったので、正しい使い方は以下の通りです

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

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

さらに、データ統計にmapreduceを使用する場合、カーソルがタイムアウト例外を取得しないようにするために、タイムアウト期間を設定する必要があります

コードは次のとおりです コードをコピー
$map = 新しい MongoCode ( '
関数(){
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 = 新しい MongoCode ( '
関数(キー、発光){
var total=0;
for(エミットの変数 i){
                                                                                                                                                                                                                                                                                                         }
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, 'クエリ' => $クエリ),配列('タイムアウト'=>self::MONGO_CURSOR_TIMEOUT) );

http://www.bkjia.com/PHPjc/629069.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/629069.html技術記事最近、統計計算にPHPのmongo拡張機能を使用しています。タイムスタンプフィールドがあります。ミリ秒単位の精度なので、長さは13桁ですが、最初は文字列の形式になっているため...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。