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

2022-10-06 13:57:14 字數 2002 閱讀 6402

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+cooaq+)

?>

下面讓我們使用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)

'; $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 = n mongo();

$instance = $instance->selecwww.cppcns.comtdb('test');

$map = '

function()

'; $reduce = '

function(key, values)

return sum;

} ';

$result = $instance->command(array(

'mapreduce' => 'test',

'map' => $map,

'reduce' => $reduce

));

$result = iterator_to_array($instance->->find());

var_dump($result);

?>

把大象放冰箱裡需要三步,而使用mapreduce僅僅需要map和reduce兩步即可,這裡有乙個pdf文件生動的說明了mysql中group by和mongodb中mapreduce的對應關係:

sql to mongodb

說明:軟體版本為mongodb(1.6.5),pecl mongo(1.1.4)。不同版本結論可能不同。

本文標題: php操作mongodb時的整數問題及對策說明

本文位址:

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

mongodb本身有兩種整數型別,分別是 32位整數和64位整數,但舊版的php驅動不管作業系統是32位還是64位,把所有整數都當做32位整數處理,結果導致64位整數被截斷。為了在盡可能保持相容性的前提下解決這個問題,新版php驅動加入了 mongo.native long 選項,以期在64位作業系...

PHP操作MongoDB例項

從mysql中把資料匯入到mongodb中做測試.連線資料庫 link mysql connect 127.0.0.1 root 123456 mysql select db jiang link mysql query set names utf 8 sql select id name addr...

PHP操作Mongodb筆記

1.首先連線mongodb m new mongoclient 預設埠為mongodb localhost 27017 2.選擇mongodb資料庫 conn m dbname dbname為你的dbname名 3.選擇你要操作的集合 也就是關係型資料庫裡的表 res conn listname l...