The MongoDB itself has two integer types: 32-bit integers and 64-bit integers, but the older PHP driver, regardless of the operating system's 32-bit or 64-bit, treats all integers as 32-bit integers, resulting in 64-bit integers being truncated. In order to solve this problem with as much compatibility as possible, the new PHP driver joins the Mongo.native-longoption to treat all integers as 64 bits in a 64-bit operating system, with an interest in reference to: 64-bit integers in MongoDB。
So does the PHP driver really solve the integer problem completely? No! There are also bugswhen working with group operations:
To illustrate the problem, let's start by generating some test data:
Copy Code code as follows:
<?php
Ini_set (' Mongo.native_long ', 1);
$instance = new Mongo ();
$instance = $instance->selectcollection (' Test ', ' test ');
for ($i = 0; $i < $i + +) {
$instance->insert Array (
' group_id ' => rand (1, 5),
' Count ' => rand (1, 5),
));
}
?>
Let's use the group action, grouped by group_id, to summarize the count:
Copy Code code as follows:
<?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);
?>
The results are not the same as expected, and the count does not accumulate, but instead becomes [object], and now if you must use group operations, there are two ways to mitigate this problem:
Copy Code code as follows:
Ini_set (' Mongo.native_long ', 0);
$initial = Array (' Count ' => (float) 0);
Both approaches are stopgap measures, and since there is a problem with the implementation of group in the current PHP driver, let's go around it and implement the same function in other ways, which is MapReduce:
Copy Code code as follows:
<?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);
?>
It takes three steps to put an elephant in the fridge, and using mapreduce requires only map and reduce two steps, and here's a PDF document that graphically illustrates the correspondence between group by and MongoDB in MySQL:
SQL to MongoDB
In addition, there are a lot of information available for reference, such as:MongoDB Aggregation iii:map-reduce Basics.
Description: The software version is MongoDB (1.6.5), PECL Mongo (1.1.4). Different versions may have different conclusions.