PHP操作MongoDB時的整數(shù)問題及對策說明
那么PHP驅(qū)動真的完全解決了整數(shù)問題么?NO!在處理group操作的時候還有BUG:
為了說明問題,我們先來生成一些測試數(shù)據(jù):
<?php
ini_set('mongo.native_long', 1);
$instance = new Mongo();
$instance = $instance->selectCollection('test', 'test');
for ($i = 0; $i < 10; $i++) {
$instance->insert(array(
'group_id' => rand(1, 5),
'count' => rand(1, 5),
));
}
?>
下面讓我們使用group操作,根據(jù)group_id分組,匯總計算count:
<?php
ini_set('mongo.native_long', 1);
$instance = new Mongo();
$instance = $instance->selectCollection('test', 'test');
$keys = array('group_id' => 1);
$initial = array('count' => 0);
$reduce = '
function(obj, prev) {
prev.count += obj.count;
}
';
$result = $instance->group($keys, $initial, $reduce);
var_dump($result);
?>
結(jié)果和預想的有出入,count沒有實現(xiàn)累加,而是變成了[object Object],目前,如果必須使用group操作,那么有兩種方法可以緩解這個問題:
ini_set('mongo.native_long', 0);
$initial = array('count' => (float)0);
這兩種方法都是治標不治本的權(quán)宜之計,既然當前PHP驅(qū)動里group的實現(xiàn)有問題,那我們就繞開它,用其它的方式實現(xiàn)同樣的功能,這個方式就是MapReduce:
<?php
ini_set('mongo.native_long', 1);
$instance = new Mongo();
$instance = $instance->selectDB('test');
$map = '
function() {
emit(this.group_id, this.count);
}
';
$reduce = '
function(key, values) {
var sum = 0;
for (var index in values) {
sum += values[index];
}
return sum;
}
';
$result = $instance->command(array(
'mapreduce' => 'test',
'map' => $map,
'reduce' => $reduce
));
$result = iterator_to_array($instance->{$result['result']}->find());
var_dump($result);
?>
把大象放冰箱里需要三步,而使用MapReduce僅僅需要Map和Reduce兩步即可,這里有一個PDF文檔生動的說明了MySQL中GROUP BY和MongoDB中MapReduce的對應關(guān)系:
此外,還有很多資料可供參考,如:MongoDB Aggregation III: Map-Reduce Basics。
說明:軟件版本為MongoDB(1.6.5),PECL Mongo(1.1.4)。不同版本結(jié)論可能不同。
- PHP中將字符串轉(zhuǎn)化為整數(shù)(int) intval() printf() 性能測試
- PHP取整數(shù)函數(shù)常用的四種方法小結(jié)
- PHP把小數(shù)轉(zhuǎn)成整數(shù)3種方法
- PHP整數(shù)取余返回負數(shù)的相關(guān)解決方法
- PHP數(shù)據(jù)類型之整數(shù)類型、浮點數(shù)的介紹
- php計算兩個整數(shù)的最大公約數(shù)常用算法小結(jié)
- PHP正則判斷一個變量是否為正整數(shù)的方法
- PHP判斷FORM表單或URL參數(shù)來的數(shù)據(jù)是否為整數(shù)的方法
- 使用字符串函數(shù)輸出整數(shù)化的PHP版本號
- PHP中有關(guān)長整數(shù)的一些操作教程
相關(guān)文章
生成靜態(tài)頁面的php函數(shù),php愛好者站推薦
生成靜態(tài)頁面的php函數(shù),php愛好者站推薦...2007-03-03解析WordPress中函數(shù)鉤子hook的作用及基本用法
這篇文章主要介紹了解析WordPress中函數(shù)鉤子hook的作用及基本用法,hook是WordPress中調(diào)用函數(shù)的重要用法,也是插件開發(fā)的基礎,需要的朋友可以參考下2015-12-12