PHP操作MongoDB時(shí)的整數(shù)問題及對(duì)策說明
那么PHP驅(qū)動(dòng)真的完全解決了整數(shù)問題么?NO!在處理group操作的時(shí)候還有BUG:
為了說明問題,我們先來生成一些測(cè)試數(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分組,匯總計(jì)算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é)果和預(yù)想的有出入,count沒有實(shí)現(xiàn)累加,而是變成了[object Object],目前,如果必須使用group操作,那么有兩種方法可以緩解這個(gè)問題:
ini_set('mongo.native_long', 0);
$initial = array('count' => (float)0);
這兩種方法都是治標(biāo)不治本的權(quán)宜之計(jì),既然當(dāng)前PHP驅(qū)動(dòng)里group的實(shí)現(xiàn)有問題,那我們就繞開它,用其它的方式實(shí)現(xiàn)同樣的功能,這個(gè)方式就是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兩步即可,這里有一個(gè)PDF文檔生動(dòng)的說明了MySQL中GROUP BY和MongoDB中MapReduce的對(duì)應(yīng)關(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() 性能測(cè)試
- PHP取整數(shù)函數(shù)常用的四種方法小結(jié)
- PHP把小數(shù)轉(zhuǎn)成整數(shù)3種方法
- PHP整數(shù)取余返回負(fù)數(shù)的相關(guān)解決方法
- PHP數(shù)據(jù)類型之整數(shù)類型、浮點(diǎn)數(shù)的介紹
- php計(jì)算兩個(gè)整數(shù)的最大公約數(shù)常用算法小結(jié)
- PHP正則判斷一個(gè)變量是否為正整數(shù)的方法
- PHP判斷FORM表單或URL參數(shù)來的數(shù)據(jù)是否為整數(shù)的方法
- 使用字符串函數(shù)輸出整數(shù)化的PHP版本號(hào)
- PHP中有關(guān)長(zhǎng)整數(shù)的一些操作教程
相關(guān)文章
PHP實(shí)現(xiàn)逐行刪除文件右側(cè)空格的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)逐行刪除文件右側(cè)空格的方法,涉及php針對(duì)文件的打開、逐行讀取、rtrim函數(shù)刪除右側(cè)空格及文件保存等技巧,需要的朋友可以參考下2015-12-12
PHP回調(diào)函數(shù)概念與用法實(shí)例分析
這篇文章主要介紹了PHP回調(diào)函數(shù)概念與用法,簡(jiǎn)單介紹了回調(diào)函數(shù)的概念、原理,并結(jié)合實(shí)例形式分析了回調(diào)函數(shù)的相關(guān)使用技巧,需要的朋友可以參考下2017-11-11
php下實(shí)現(xiàn)一個(gè)阿拉伯?dāng)?shù)字轉(zhuǎn)中文數(shù)字的函數(shù)
最近因需要,寫了個(gè)“阿拉伯?dāng)?shù)字轉(zhuǎn)中文數(shù)字的函數(shù)”。搜索了精華區(qū)只見到一個(gè)類似的。 感覺到我的算法不錯(cuò),所以貼出來共享一下2008-07-07
基于magic_quotes_gpc與magic_quotes_runtime的區(qū)別與使用介紹
本篇文章小編為大家介紹,基于magic_quotes_gpc與magic_quotes_runtime的區(qū)別與使用介紹。需要的朋友參考下2013-04-04
PHP封裝的svn類使用內(nèi)置svn函數(shù)實(shí)現(xiàn)根據(jù)svn版本號(hào)導(dǎo)出相關(guān)文件示例
這篇文章主要介紹了PHP封裝的svn類使用內(nèi)置svn函數(shù)實(shí)現(xiàn)根據(jù)svn版本號(hào)導(dǎo)出相關(guān)文件,結(jié)合實(shí)例形式分析了php封裝的svn操作類與根據(jù)版本導(dǎo)出相關(guān)版本文件操作技巧,需要的朋友可以參考下2018-06-06
在任意字符集下正常顯示網(wǎng)頁的方法二(續(xù))
在任意字符集下正常顯示網(wǎng)頁的方法二(續(xù))...2007-04-04
PHP使用redis消息隊(duì)列發(fā)布微博的方法示例
這篇文章主要介紹了PHP使用redis消息隊(duì)列發(fā)布微博的方法,結(jié)合具體實(shí)例形式分析了php結(jié)合redis數(shù)據(jù)庫操作消息隊(duì)列實(shí)現(xiàn)微博發(fā)布的相關(guān)技巧與注意事項(xiàng),需要的朋友可以參考下2017-06-06


