這篇文章主要講解了“PHP操作MongoDB時的整數(shù)問題怎么解決”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“PHP操作MongoDB時的整數(shù)問題怎么解決”吧!
創(chuàng)新互聯(lián)服務(wù)項目包括鄉(xiāng)寧網(wǎng)站建設(shè)、鄉(xiāng)寧網(wǎng)站制作、鄉(xiāng)寧網(wǎng)頁制作以及鄉(xiāng)寧網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,鄉(xiāng)寧網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到鄉(xiāng)寧省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
PHP驅(qū)動真的完全解決了整數(shù)問題么?NO!在處理group操作的時候還有BUG:
為了說明問題,我們先來生成一些測試數(shù)據(jù):
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:
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沒有實現(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:
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', 'out' => 'name', 'map' => $map, 'reduce' => $reduce )); $result = iterator_to_array($instance->{$result['result']}->find()); var_dump($result); ?>
說明:雖然從表面上看MapReduce要生成一個新的Collection,顯得有些低效,但我們可以定期預(yù)生成它,相當于維護一個緩存表,只要對實時性要求不太高就沒問題。
把大象放冰箱里需要三步,而使用MapReduce僅僅需要Map和Reduce兩步即可,這里有一個PDF文檔生動的說明了MySQL中GROUP BY和MongoDB中MapReduce的對應(yīng)關(guān)系:
感謝各位的閱讀,以上就是“PHP操作MongoDB時的整數(shù)問題怎么解決”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對PHP操作MongoDB時的整數(shù)問題怎么解決這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!