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
truehttp://www.bkjia.com/PHPjc/323216.html
技術記事 MongoDB 自体には、32 ビット整数と 64 ビット整数の 2 つの整数型があります。ただし、古いバージョンの PHP ドライバーは、オペレーティング システムが 32 ビットであるか 64 ビットであるかに関係なく、すべての整数を 32 ビット整数として扱います。結果は...