PHP_PHP チュートリアルで MongoDB を操作する場合の整数の問題と対策

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

MongoDB 自体には、32 ビット整数と 64 ビット整数の 2 つの整数型があります。ただし、古いバージョンの PHP ドライバーは、オペレーティング システムが 32 ビットであるか 64 ビットであるかに関係なく、すべての整数を 32 ビット整数として扱います。結果として、64 ビット整数は切り捨てられます。可能な限り互換性を維持しながらこの問題を解決するために、PHP ドライバーの新しいバージョンには、64 ビット オペレーティング システムで整数を 64 ビットとして扱うための mongo.native-long オプションが追加されました。興味のある方は、MongoDB の 64 ビット整数 を参照してください。

それでは、PHP ドライバーは本当に整数の問題を完全に解決するのでしょうか?いいえ!グループ操作を扱う場合には、別の バグ があります:

問題を説明するために、まずテスト データを生成しましょう:

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

ini_set('mongo.native_long', 1); $instance = new Mongo( );
$instance = $instance->selectCollection('test', 'test');
for ($i = 0; $i $instance- >insert(array(
'group_id' => rand(1, 5),
'count' => rand(1, 5),
));
?> を使用しましょう以下の group_id に従ってグループ操作を行い、カウントを計算します:


コードをコピーします

コードは次のとおりです:
ini_set('mongo.native_long', 1);インスタンス = 新しい Mongo(); $instance = $instance->selectCollection('test', 'test');
$keys = array('group_id' => 1); ' =>
$reduce = '
function(obj, prev) {
prev.count += obj.count;
';初期値, $reduce);
var_dump($result) ;


結果は期待されたものと異なりますが、グループ操作を使用する必要がある場合は、この問題を軽減するには 2 つの方法があります:



コードをコピーします

コードは次のとおりです:

ini_set('mongo.native_long', 0);
$initial = array('count' => ( float)0);
どちらの方法も、根本的な原因ではなく症状を治療する一時的な手段です。現在の PHP ドライバーのグループの実装に問題があるため、それをバイパスして他の方法を使用します。このメソッドは MapReduce です:

コードをコピーします

コードは次のとおりです:

ini_set('mongo.native_long', 1); ();
$instance = $instance->selectDB('test');
$map = ' function() { emit(this.group_id, this.count) '; ' 関数(キー, 値) {
var sum = 0;
for (valuesのvarインデックス)
}
return sum
}
'; ->command(array(
'mapreduce' => 'test',
'map' => $map,
'reduce' => $reduce
));
$result = iterator_to_array($instance-) >{$result['result']}->find());



;
象を冷蔵庫に入れるには 3 つのステップが必要ですが、MapReduce を使用するには、Map と Reduce の 2 つのステップだけが必要です。これは、MySQL の GROUP BY と MongoDB の MapReduce の対応関係を鮮やかに示した PDF ドキュメントです。




SQLからMongoDBへ


さらに、
MongoDB Aggregation III: Map-Reduce Basics
など、参考となる資料が多数あります。

注: ソフトウェアのバージョンは MongoDB (1.6.5)、PECL Mongo (1.1.4) です。バージョンが異なると結論が異なる場合があります。

http://www.bkjia.com/PHPjc/323216.html

www.bkjia.com

tru​​e

http://www.bkjia.com/PHPjc/323216.html

技術記事

MongoDB 自体には、32 ビット整数と 64 ビット整数の 2 つの整数型があります。ただし、古いバージョンの PHP ドライバーは、オペレーティング システムが 32 ビットであるか 64 ビットであるかに関係なく、すべての整数を 32 ビット整数として扱います。結果は...

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!