PHP 驱动程序 Bug 和策略 MongoDB 整数问题
整数问题实际上不是 MongoDB 的问题,而是 PHP 驱动程序的问题:MongoDB 本身有两种整数类型,即 32 位整数和 64 位整数,但旧的 PHP 驱动程序对待无论操作系统是 32 位还是 64 位,所有整数都作为 32 位整数,从而导致 64 位整数被截断。为了解决这个问题,同时尽可能保持兼容性,新版本的 PHP 驱动程序添加了 mongo.native-long 选项,在 64 位操作系统上将整数视为 64 位。有兴趣的可以参考:64-bit Integers in MongoDB。
PHP 驱动程序真的能解决整个问题吗?不!处理分组操作时仍然出现错误:
为了说明问题,我们先生成一些测试数据:
|
结果与预期不同。 Count并没有实现累加,而是变成了[object Object]。目前,如果必须使用分组操作,有两种方法可以缓解这个问题:
ini_set('mongo.native_long', 0); |
$initial = array('count ' => (float)0) ; |
这两种方法都是治标不治本的权宜之计。由于当前 PHP 驱动程序中的组实现存在问题,因此我们将解决该问题并使用其他方法来实现相同的目的。函数,这个方法就是MapReduce:
|
把大象放进冰箱需要三步,但是使用MapReduce只需要Map和Reduce两步。这里有一个PDF文档,形象地说明了MongoDB中GROUP BY MySQL和MapReduce之间的适当关系:
SQL to MongoDB
此外,还有很多参考资料,例如:MongoDB Aggregation III: Map-Reduce Funds。
注:软件版本:MongoDB (1.6.5)、PECL Mongo (1.1.4)。不同版本的结论可能有所不同。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。