整数规划问题和对策当PHP运行MongoDB

整数规划问题和对策当PHP运行MongoDB
MongoDB本身具有两个整数类型,即32位整数和64位整数,但PHP驱动的旧版本没有是否操作系统是32位或64位的事,所有的整数被视为32位整数,导致64位整数被截断。为了解决兼容性的前提这一问题,PHP驱动的新版本加入了mongo.native-long选项,为了处理整数在64位操作系统的64位。如果你有兴趣,你可以参考一下:64位整数在MongoDB。

那么PHP驱动程序真的能完全解决整数问题吗不!在处理组操作时,也有bug:

为了说明这个问题,我们首先生成一些测试数据:
复制代码代码如下所示:
< PHP
ini_set('mongo。native_long ',1);
Mongo()美元=新实例;
实例=美元美元实例-> selectcollection(测试,测试);
($ i = 0;$ i < 10;$ + +){
$实例>插入(数组)
group_id ' =兰特(1, 5),
计数=兰德(1, 5),
));
}
>

让我们用这组操作数的计算的基础上group_id分组。
复制代码代码如下所示:
< PHP
ini_set('mongo。native_long ',1);
Mongo()美元=新实例;
实例=美元美元实例-> selectcollection(测试,测试);
$键=阵列('group_id ' = 1);
初始=阵列(count美元= 0);
美元=
功能(obj,沪指){
prev.count = obj.count;
}
';
$ $实例>组($键,初始值,$减少);
var_dump($结果);
>

结果与预期不同。计数没有实现累计,但已成为{对象}。目前,如果有必要进行集团化操作,有两种方法可以缓解这一问题。
复制代码代码如下所示:
ini_set('mongo。native_long ',0);
初始=阵列(count美元=(浮动)0);

这两种方法都是临时解的临时解。由于在php驱动程序组中出现了问题,我们将绕过它并使用其他方法来实现相同的功能。这边是MapReduce:
复制代码代码如下所示:
< PHP
ini_set('mongo。native_long ',1);
Mongo()美元=新实例;
实例=美元美元实例-> selectdb(测试);
$ map =
函数(){
(this.group_id发出,这个数。);
}
';
美元=
函数(键,值){
var总和= 0;
对于(值中的var索引){
总和=值{索引};
}
收起回复;
}
';
元实例命令(数组)
MapReduce= >测试,
map= $ map,
减少=减少$
));
结果= iterator_to_array美元($实例-> { { } } $结果'result->找到());
var_dump($结果);
>
把大象放进冰箱需要三步,而使用MapReduce只需要两步的地图和减少。这是一个PDF文档,生动地说明了mysql中的MapReduce与组之间的对应关系。

SQL MongoDB

此外,有大量的信息供参考,如:MongoDB聚合三:降低基础地图。

描述:软件版本是MongoDB(1.6.5)、PECL Mongo(1.1.4)不同的版本可能是不同的。

tag:运行整数对策电脑软件php

相关内容