PHP操作MongoDB时的整数问题及对策说明
MongoDB本身有两种整数类型,即32位整数和64位整数。但是,无论操作系统是32位还是64位,旧的PHP驱动程序都将所有整数视为32位整数,导致64位整数被截断。为了在尽可能保持兼容性的前提下解决这个问题,新的PHP驱动增加了mongo.native-long选项,以便在64位操作系统中将整数作为64位来对待。感兴趣的请参考MongoDB中的64位整数。那么PHP驱动真的能彻底解决整数问题吗?不!处理组操作时有bug:为了说明问题,我们先生成一些测试数据:复制代码如下:php ini_set('mongo.native_long ',1);$ instance=new Mongo();$ instance=$ instance-selectCollection(' test ',' test ');for($ I=0;10美元;$ I){ $ instance-insert(array(' group _ id '=rand(1,5),' count'=rand(1,5),);} ?我们用分组运算,按照group_id分组,汇总计算计数:复制代码如下: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($ key,$initial,$ reduce);var _ dump($ result);结果与预期的不同。计数不是累积,而是变成[[对象对象]]。目前,如果必须使用分组操作,有两种方法可以缓解这个问题:复制代码如下: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='函数(键,值){ var sum=0;for(var index in values){ sum=values[index];}返回总和;} ';$ result=$ instance-command(array(' MapReduce '=' test ',' map'=$map,' reduce '=$ reduce));$ result=iterator _ to _ array($ instance-{ $ result[' result ']}-find());var _ dump($ result);将大象放入冰箱需要三个步骤,但使用MapReduce只需要两个步骤。这里有一个PDF文档生动地说明了MySQL中的GROUP BY和MongoDB中的MapReduce之间的对应关系:。
此外,还有很多资料可以参考,比如MongoDB aggregation iii:map-reduce基础。说明:软件版本是MongoDB(1.6.5)和PECL Mongo(1.1.4)。不同的版本可能会有不同的结论。
版权声明:PHP操作MongoDB时的整数问题及对策说明是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。