2011-12-07 8 views
6

Cuando estoy corriendo Map-Reduce en una base de datos de Mongo, por lo general obtener resultados similares a los siguientes:¿Cómo cambiar la estructura del mapa de MongoDB, reducir los resultados?

{ _id: <some-id>, value: { <first-key>: <first-value>, ... } } 

¿Hay una manera de omitir la parte value: { ... } y directamente insertar el contenido de value en el resultado ? Básicamente, me gustaría tener un resultado que se parece a la siguiente:

{ _id: <some-id>, <first-key>: <first-value>, ... } 

Esta manera de que pudiera combinar los resultados de nuevo en una colección existente que obedece a este formato.

También tengo otra pregunta con respecto a Map-Reduce: ¿Es posible acceder a otra colección desde la función map o reduce?

+0

posible duplicado de [En MongoDB mapreduce, ¿cómo puedo aplanar el objeto de valores?] (Http://stackoverflow.com/questions/7257989/in-mongodb-mapreduce-how-can-i-flatten-the-values -objeto) –

Respuesta

6

MapReduce sólo devuelve los documentos de la forma {_id: some_id, valor: some_value}

"some_value" no necesariamente tiene que ser un documento incrustado, pero en la mayoría de los casos es permitir que se calculen múltiples variables mediante la función Map Reduce. Los documentos devueltos por la función Reducir deben estar en la misma forma en que se ingresan, porque la función Reducir puede ejecutarse repetidamente para cualquier valor _id dado.

Para ver paso a paso cómo funciona Map Reduce, consulte la sección "Extras" de la receta de Cookbook de MongoDB titulada "Encontrar valores máximos y mínimos con documentos versionados" http://cookbook.mongodb.org/patterns/finding_max_and_min/ Esto debería proporcionar una mejor comprensión de cómo Map Reducir trabajos, y por qué el resultado debe tener el formato {_id: algún_id, valor: algún_valor}

Es posible hacer un Map Reducir incremental, que combinará los resultados de múltiples funciones de Map Reduce. http://www.mongodb.org/display/DOCS/MapReduce#MapReduce-IncrementalMapreduce

Por último, este momento no es posible acceder a varias colecciones a la vez con MapReduce. Hay una solicitud de función para esta capacidad, pero no está programada para agregarse a ninguna de las próximas versiones.
https://jira.mongodb.org/browse/SERVER-970

0

Esto funcionó para mí:
Suponiendo que está emitiendo this o una variación de la misma en un mapa, this._id = undefined primer set.
Establecer el modo de fusión.

Compruebe mi ejemplo here

0

RE: Acceso a otras colecciones de dentro Mapa/Reducir funciones. Lo que puede hacer es aprovechar el "alcance" para enviar los datos necesarios por m/r durante la ejecución. NOTA: el alcance solo acepta una colección SIMPLE de objetos aquí. Por simple, me refiero a ningún documento anidado.

scope = { People : [{ Name : 'bob', Color : 'blue'}, { Name : 'sally', Color: 'orange'}] } 

La colección de alcance anterior funciona bien. En función de la mañana/r sólo se refiere a 'People' como una variable global y se puede iterar a través de su colección, etc.

scope = { People : [{ Name : 'bob', Color : { Favorite : 'blue'} }, { Name : 'sally', Color : { Favorite : 'orange' } }] } 

Lo anterior no quiere trabajar, dependiendo del controlador que está utilizando obtendrá un Range Error y le informaron que se ha excedido el tamaño máximo de la llamada o algo así. Cumplir con los objetos simples en el alcance mantendrá la vida simple.

Cuestiones relacionadas