university tutorial instalar example descargar caracteristicas mongodb

instalar - mongodb tutorial



mapa mongoDB/reducir menos la reducción (5)

Tengo algunos documentos de 25k (4 GB en raw json) de datos en los que deseo realizar algunas operaciones de javascript para que sean más accesibles para mi consumidor de datos finales ( R ), y me gustaría clasificarlos como "control de versiones". Cambios agregando una nueva colección para cada cambio, pero no puedo averiguar cómo map/reduce sin reduce . Quiero un mapeo de documentos uno a uno: comienzo con 25,356 documentos en la collection_1 y quiero terminar con 25,356 documentos en la collection_2 .

Puedo hackearlo con esto:

var reducer = function(key, value_array) { return {key: value_array[0]} }

Y luego llámalo como:

db.flat_1.mapReduce(mapper, reducer, {keeptemp: true, out: ''flat_2''})

(Mi mapeador solo llama a emitir una vez, con una cadena como primer argumento y el documento final como segundo. Es una recopilación de esos segundos argumentos que realmente quiero).

Pero eso parece extraño y no sé por qué funciona, ya que mis argumentos de llamada de emit en mi asignador no son equivalentes al argumento de devolución de mi reducer . Además, termino con un documento como

{ "_id": "0xWH4T3V3R", "value": { "key": { "finally": ["here"], "thisIsWhatIWanted": ["Yes!"] } } }

Lo que parece innecesario.

Además, un cursor que realiza sus propias inserciones no es ni una décima tan rápido como mapReduce . No conozco MongoDB lo suficientemente bien como para compararlo, pero creo que es 50x más lento. ¿Hay una manera de correr a través de un cursor en paralelo? No me importa si los documentos en mi collection_2 están en un orden diferente a los de la collection_1 .


Pero eso parece extraño y no sé por qué funciona, ya que mis argumentos de llamada de emit en mi asignador no son equivalentes al argumento de devolución de mi reducer .

Son equivalentes. La función de reducción toma una matriz de valores T y debería devolver un solo valor en el mismo formato T El formato de T está definido por su función de mapa. Su función de reducción simplemente devuelve el primer elemento de la matriz de valores, que siempre será de tipo T Por eso funciona :)

Pareces estar en el camino correcto. Hice algunos experimentos y parece que no puedes hacer un db.collection.save() desde la función de mapa, pero puedes hacerlo desde la función de reducción. Su función de mapa debería simplemente construir el formato de documento que necesita:

function map() { emit(this._id, { _id: this.id, heading: this.title, body: this.content }); }

La función de mapa reutiliza el ID del documento original. Esto debería evitar que se vuelvan a reducir los pasos, ya que ningún valor compartirá la misma clave.

La función de reducción puede simplemente devolver null . Pero además, puede escribir el valor en una colección separada .

function reduce(key, values) { db.result.save(values[0]); return null; }

Ahora db.result debe contener los documentos transformados, sin ningún ruido adicional de reducción de mapa que tendría en la colección temporal. Realmente no he probado esto en grandes cantidades de datos, pero este enfoque debería aprovechar la ejecución en paralelo de las funciones de reducción de mapa.


Cuando tienes acceso al shell mongo, acepta algunos comandos de Javascript y luego es más sencillo:

map = function(item){ db.result.insert(item); } db.collection.find().forEach(map);


Cuando usas map / reduce siempre terminarás con

{ "value" : { <reduced data> } }

Para eliminar la clave de value , deberá utilizar una función de finalize .

Aquí es lo más simple que puede hacer para copiar datos de una colección a otra:

map = function() { emit(this._id, this ); } reduce = function(key, values) { return values[0]; } finalize = function(key, value) { db.collection_2.insert(value); }

Entonces, cuando correrías como de costumbre:

db.collection_1.mapReduce(map, reduce, { finalize: finalize });


Me enfrenté a la misma situación. Pude lograr esto a través de la consulta y proyección de Mongo. ver Mongo Query