亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 4919 | 回復: 1
打印 上一主題 下一主題

[MongoDB] PHP操作MongoDB時的整數(shù)問題及對策 [復制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2012-02-23 19:03 |只看該作者 |倒序瀏覽
]
PHP操作MongoDB時的整數(shù)問題及對策





本文是一篇轉(zhuǎn)載文章,對MongoDB PHP驅(qū)動中的一個bug進行了描述,其間對MongoDB和Group操作和MapReduce操作都給出了典型的例子,值得一看。

原文鏈接:http://huoding.com/2011/03/13/55

本文所說的整數(shù)問題,其實并不是MongoDB的問題,而是PHP驅(qū)動的問題:MongoDB本身有兩種整數(shù)類型,分別是:32位整數(shù)和64位整數(shù),但舊版的PHP驅(qū)動不管操作系統(tǒng)是32位還是64位,把所有整數(shù)都當做32位整數(shù)處理,結(jié)果導致64位整數(shù)被截斷。為了在盡可能保持兼容性的前提下解決這個問題,新版PHP驅(qū)動加入了mongo.native-long選項,以期在64位操作系統(tǒng)中把整數(shù)都當做64位來處理,有興趣的可參考:64-bit integers in MongoDB。

那么PHP驅(qū)動真的完全解決了整數(shù)問題么?NO!在處理group操作的時候還有BUG:

為了說明問題,我們先來生成一些測試數(shù)據(jù):
  1. selectCollection('test', 'test');

  2. for ($i = 0; $i < 10; $i++) {
  3.     $instance->insert(array(
  4.         'group_id' => rand(1, 5),
  5.         'count'    => rand(1, 5),
  6.     ));
  7. }
  8. ?>下面讓我們使用group操作,根據(jù)group_id分組,匯總計算count:

  9. selectCollection('test', 'test');
  10. $keys = array('group_id' => 1);
  11. $initial = array('count' => 0);

  12. $reduce = '
  13.     function(obj, prev) {
  14.         prev.count += obj.count;
  15.     }
  16. ';

  17. $result = $instance->group($keys, $initial, $reduce);
  18. 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:
  1. selectDB('test');

  2. $map = '
  3.     function() {
  4.         emit(this.group_id, this.count);
  5.     }
  6. ';

  7. $reduce = '
  8.     function(key, values) {
  9.         var sum = 0;

  10.         for (var index in values) {
  11.             sum += values[index];
  12.         }

  13.         return sum;
  14.     }
  15. ';

  16. $result = $instance->command(array(
  17.     'mapreduce' => 'test',
  18.     'out'       => 'name',
  19.     'map'       => $map,
  20.     'reduce'    => $reduce
  21. ));

  22. $result = iterator_to_array($instance->{$result['result']}->find());
  23. var_dump($result);
  24. ?>
復制代碼
說明:雖然從表面上看MapReduce要生成一個新的Collection,顯得有些低效,但我們可以定期預生成它,相當于維護一個緩存表,只要對實時性要求不太高就沒問題。

把大象放冰箱里需要三步,而使用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é)論可能不同。

論壇徽章:
0
2 [報告]
發(fā)表于 2012-02-24 17:06 |只看該作者
希望與樓至多多交流
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP