php - que - Mapa de Mongo Reducir la primera vez
mongodb español (2)
Bien, he encontrado algo que creo que puede hacer lo que quieras. Tenga en cuenta que esto puede no funcionar exactamente, ya que no estoy 100% seguro de su esquema (teniendo en cuenta que los ejemplos muestran refer
disponible en tipo a, pero no b (no estoy seguro si eso es una omisión, o lo que sea que quiera hacer) ver por referencia) ... De todos modos, esto es lo que se me ocurrió:
La función del mapa:
function() {
var obj = {
"types": {},
"tags": {},
}
obj.types[this.type] = 1;
if (this.tags) {
for (var tag in this.tags) {
obj.tags[this.tags[tag]] = 1;
}
}
emit(this.refer.url, obj);
}
La función Reducir:
function(key, values) {
var obj = {
"types": {},
"tags": {},
}
for (var i = 0; i < values.length; i++) {
for (var type in values[i].types) {
if (!type in obj.types) {
obj.types[type] = 0;
}
obj.types[type] += values[i].types[type];
}
for (var tag in values[i].tags) {
if (!tag in obj.tags) {
obj.tags[tag] = 0;
}
obj.tags[tag] += values[i].tags[tag];
}
}
return obj;
}
Entonces, básicamente, cómo funciona es esto. La función de mapa utiliza una clave de refer.url (lo que adiviné según su descripción). Por lo tanto, el resultado final se verá como una matriz con _id
igual a refer.url (Se agrupa según url). Luego crea un objeto que tiene dos objetos debajo (tipos y etiquetas). La razón para el objeto es para que map y reduce puedan emitir el mismo objeto de formato. Aparte de eso, CREO que debería ser relativamente auto explicativo (si no entiendes, puedo tratar de explicar más) ...
Así que implementemos esto en PHP (suponiendo que $map
y $reduce
son cadenas con lo anterior contenido para la concisión):
$mapFunc = new MongoCode($map);
$reduceFunc = new MongoCode($reduce);
$query = array(
''time'' => array(''$gte'' => time() - (60*60*60*24*30)),
''refer.external'' => true
);
$collection = ''visits'';
$command = array(
''mapreduce'' => $collection,
''map'' => $mapFunc,
''reduce'' => $reduceFunc,
''query'' => $query,
);
$statsInfo = $db->command($command);
$statsCollection = $db->selectCollection($sales[''result'']);
$stats = $statsCollection->find();
foreach ($stats as $stat) {
echo $stats[''_id''] .'' Visited '';
foreach ($stats[''value''][''types''] as $type => $times) {
echo "Type $type $times Times, ";
}
foreach ($stats[''value''][''tags''] as $tag => $times) {
echo "Tag $tag $times Times, ";
}
echo "/n";
}
Tenga en cuenta que no he probado esto. Esto es exactamente lo que he encontrado en función de mi comprensión de su esquema, y de mi comprensión de Mongo y su implementación de Map-Reduce ...
Primer mapa / Reducir usuario aquí y usando MongoDB. Tengo una gran cantidad de datos de visitas a la página que me gustaría tener un poco de sentido mediante el uso de Map / Reduce. Debajo está básicamente lo que quiero hacer, pero como principiante total, un Mapa / Reducir, ¡creo que está por encima de mi conocimiento!
- Revise todas las páginas con visitas en los últimos 30 días, y donde external = true.
- Luego, para cada página, encuentre todas las visitas
- Agrupe todas las visitas por ubicación de referencia
- Para cada ubicación de referencia, calcule cuántos visitaron una página que tiene un cierto "tipo" y también tiene una determinada palabra en las "etiquetas".
La base de datos y la colección están organizados como
$mongo->dbname->visits
Un documento de muestra es:
{"url": "www.example.com", "type": "a", "refer": {"external": true, "domain": "twitter.com", "url": "http://www.twitter.com/page"}, "page": "1235", "user": "1232", "time": 1234567890}
Y luego quiero encontrar documentos de tipo B con cierta etiqueta.
{"url": "www.example.com", "type": "b", "page": "745", "user": "1232", "time": 1234567890, "tags": {"a", "b", "c"}}
Estoy usando la extensión normal de Mongo PHP si eso tiene un impacto.
Map reduce ya está implementado en Mongo DB ODM:
http://www.doctrine-project.org/docs/mongodb_odm/1.0/en/reference/map-reduce.html