您好,登錄后才能下訂單哦!
這篇文章主要講解了“PHP操作MongoDB時的整數問題怎么解決”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“PHP操作MongoDB時的整數問題怎么解決”吧!
PHP驅動真的完全解決了整數問題么?NO!在處理group操作的時候還有BUG:
為了說明問題,我們先來生成一些測試數據:
<?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操作,根據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); ?>
結果和預想的有出入,count沒有實現累加,而是變成了[object Object],目前,如果必須使用group操作,那么有兩種方法可以緩解這個問題:
方法一:
ini_set('mongo.native_long', 0);
方法二:
$initial = array('count' => (float)0);
這兩種方法都是治標不治本的權宜之計,既然當前PHP驅動里group的實現有問題,那我們就繞開它,用其它的方式實現同樣的功能,這個方式就是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', 'out' => 'name', 'map' => $map, 'reduce' => $reduce )); $result = iterator_to_array($instance->{$result['result']}->find()); var_dump($result); ?>
說明:雖然從表面上看MapReduce要生成一個新的Collection,顯得有些低效,但我們可以定期預生成它,相當于維護一個緩存表,只要對實時性要求不太高就沒問題。
把大象放冰箱里需要三步,而使用MapReduce僅僅需要Map和Reduce兩步即可,這里有一個PDF文檔生動的說明了MySQL中GROUP BY和MongoDB中MapReduce的對應關系:
感謝各位的閱讀,以上就是“PHP操作MongoDB時的整數問題怎么解決”的內容了,經過本文的學習后,相信大家對PHP操作MongoDB時的整數問題怎么解決這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。