您好,登錄后才能下訂單哦!
本篇內容介紹了“PHP操作MongoDB時有什么問題”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
MongoDB本身有兩種整數類型,分別是:32位整數和64位整數,但舊版的PHP驅動不管操作系統是32位還是64位,把所有整數都當做32位整數處理,結果導致64位整數被截斷。下面億速云小編來講解下PHP操作MongoDB時有哪些問題?
PHP操作MongoDB時有哪些問題
為了在盡可能保持兼容性的前提下解決這個問題,新版PHP驅動加入了mongo.native-long選項,以期在64位操作系統中把整數都當做64位來處理,有興趣的可參考:64-bitintegersinMongoDB。
那么PHP驅動真的完全解決了整數問題么?NO!在處理group操作的時候還有BUG:
為了說明問題,我們先來生成一些測試數據:
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:
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沒有實現累加,而是變成了[objectObject],目前,如果必須使用group操作,那么有兩種方法可以緩解這個問題:
方法一:
ini_set('mongo.native_long',0);
PHP操作MongoDB時有哪些問題
方法二:
$initial=array('count'=>(float)0);
這兩種方法都是治標不治本的權宜之計,既然當前PHP驅動里group的實現有問題,那我們就繞開它,用其它的方式實現同樣的功能,這個方式就是MapReduce:
selectDB('test');
$map='
function(){
emit(this.group_id,this.count);
}
';
$reduce='
function(key,values){
varsum=0;
for(varindexinvalues){
sum+=values[index];
}
returnsum;
}
';
$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中GROUPBY和MongoDB中MapReduce的對應關系:
此外,還有很多資料可供參考,如:MongoDBAggregationIII:Map-ReduceBasics。
“PHP操作MongoDB時有什么問題”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。