Tengo unos documentos de 25k (4 GB en raw json) de datos en los que quiero realizar algunas operaciones de javascript para hacerlo más accesible para mi consumidor de datos finales (R
), y yo Me gustaría hacer una especie de "control de versión" de estos cambios agregando una nueva colección para cada cambio, pero no puedo entender cómo map/reduce
sin el reduce
. Quiero un mapeo de documentos uno a uno: empiezo con 25,356 documentos en collection_1
, y quiero terminar con 25,356 documentos en collection_2
.mongoDB map/reduce menos the reduce
puedo entrar ilegalmente en él con esto:
var reducer = function(key, value_array) {
return {key: value_array[0]}
}
Y luego llamar así:
db.flat_1.mapReduce(mapper, reducer, {keeptemp: true, out: 'flat_2'})
(Mi asignador sólo llamadas emiten una vez, con una cadena como primer argumento y el documento final como el segundo. Es una colección de esos segundos argumentos que realmente quiero).
Pero eso parece incómodo y no sé por qué incluso funciona, ya que mi llamada emit
Los argumentos en mi mapeador no son equivalentes al argumento de retorno de mi reducer
. Además, termino con un documento como
{
"_id": "0xWH4T3V3R",
"value": {
"key": {
"finally": ["here"],
"thisIsWhatIWanted": ["Yes!"]
}
}
}
que parece innecesario.
Además, un cursor que realiza sus propias inserciones ni siquiera es una décima tan rápido como mapReduce
. No conozco a MongoDB lo suficiente para compararlo, pero supongo que se trata de 50x
más lento. ¿Hay alguna manera de ejecutar un cursor en paralelo? No me importa si los documentos en mi collection_2
están en un orden diferente al de collection_1
.
La razón funciona es porque su emiten y reductor de la llamada * * son lo mismo. Como usas el valor [0] como salida de tu reductor, tiene que ser exactamente el mismo porque no lo has cambiado (está pasando por tu reductor). – null