天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

PHP操作MongoDB時的整數問題及對策說明

MongoDB本身有兩種整數類型,分別是:32位整數和64位整數,但舊版的php驅動不管操作系統是32位還是64位,把所有整數都當做32位整數處理,結果導致64位整數被截斷。為了在盡可能保持兼容性的前提下解決這個問題,新版php驅動加入了mongo.native-long選項,以期在64位操作系統中把整數都當做64位來處理,有興趣的可參考:64-bit integers in 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',
'map' => $map,
'reduce' => $reduce
));
$result = iterator_to_array($instance->{$result['result']}->find());
var_dump($result);
?>

把大象放冰箱里需要三步,而使用MapReduce僅僅需要Map和Reduce兩步即可,這里有一個PDF文檔生動的說明了MySQL中GROUP BY和MongoDB中MapReduce的對應關系:

 

SQL to MongoDB

此外,還有很多資料可供參考,如:MongoDB Aggregation III: Map-Reduce Basics。

說明:軟件版本為MongoDB(1.6.5),PECL Mongo(1.1.4)。不同版本結論可能不同。

php技術PHP操作MongoDB時的整數問題及對策說明,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 99热久久爱五月天婷婷 | 日本高清不卡码无码v亚洲 日本福利片午夜免费观着 日本粉嫩学生毛绒绒 | 亚洲色图激情小说 | 亚洲伊人国产 | 好看的电影网站亚洲一区 | 综合人妻久久一区二区精品 | 亚洲人成网站在线播放 | 中文字幕乱偷无码AV蜜桃 | 中文字幕亚洲第一页 | 99视频在线免费 | 性色无码AV久久蜜臀 | 伊人精品影院一本到综合 | 国产精品AV色欲蜜臀在线 | 97超碰97资源在线观看视频 | 亚洲国产精品VA在线看黑人 | 好爽好深太大了再快一点 | 97精品视频 | 国际老妇高清在线观看 | 国产精品一区二区AV交换 | 久久re这里视频只精品首页 | 国产精品久久高潮呻吟无码 | 3D漫画H精品啪啪无码 | 欧美香蕉大胸在线视频观看 | 久久伊人中文字幕有码 | 暖暖 免费 日本 高清 在线1 | 久久天天综合 | 免费精品一区二区三区在线观看 | 粉色视频午夜网站入口 | 国产精品青青青高清在线密亚 | 久久久久99精品成人片三人毛片 | 久久re视频精品538在线 | 午夜影院视费x看 | 成人国产亚洲精品A区天堂蜜臀 | 妹妹的第一次有点紧 | 午夜福利视频极品国产83 | 欧美日韩视频高清一区 | 久久精品男人影院 | 99视频这里只有精品国产 | 芳草地社区在线视频 | 99视频在线免费观看 | 亚洲精品一区三区三区在线观看 |