framework examples docs agregacion mongodb mapreduce

examples - mongodb map



MapReduce en MongoDB no produce (1)

Estaba intentando usar MongoDB 2.4.3 (también intenté 2.4.4) con mapReduce en un clúster con 2 fragmentos con cada 3 réplicas. Tengo un problema con los resultados del trabajo mapReduce que no se reduce a la recopilación de resultados. Intenté reducir el mapa incremental . También intenté "fusionar" en lugar de reducir, pero tampoco funcionó.

El mapa reduce el comando ejecutado en mongos: (coll no está fragmentado)

db.coll.mapReduce(map, reduce, {out: {reduce: "events", "sharded": true}})

Que produce el siguiente resultado:

{ "result" : "events", "counts" : { "input" : NumberLong(2), "emit" : NumberLong(2), "reduce" : NumberLong(0), "output" : NumberLong(28304112) }, "timeMillis" : 418, "timing" : { "shardProcessing" : 11, "postProcessing" : 407 }, "shardCounts" : { "stats2/192.168.…:27017,192.168.…" : { "input" : 2, "emit" : 2, "reduce" : 0, "output" : 2 } }, "postProcessCounts" : { "stats1/192.168.…:27017,…" : { "input" : NumberLong(0), "reduce" : NumberLong(0), "output" : NumberLong(14151042) }, "stats2/192.168.…:27017,…" : { "input" : NumberLong(0), "reduce" : NumberLong(0), "output" : NumberLong(14153070) } }, "ok" : 1, }

Entonces veo que mapReduce se ejecuta en 2 registros, lo que da como resultado 2 registros entregados. Sin embargo, en los postProcessCounts para ambos fragmentos el conteo de entrada permanece en 0. Además, intentar encontrar el registro con una búsqueda en _id no arroja ningún resultado. En el archivo de registro de MongoDB no pude encontrar mensajes de error relacionados con esto.

Después de tratar de reproducir esto con una colección de resultados recién creada, que también se fragmentó en _id hash y también di los mismos índices, no pude reproducir esto. Al enviar la misma entrada a una colección diferente

db.coll.mapReduce(map, reduce, {out: {reduce: "events_test2", "sharded": true}})

El resultado se almacena en la colección de salida y obtuve el siguiente resultado:

{ "result" : "events_test2", "counts" : { "input" : NumberLong(2), "emit" : NumberLong(2), "reduce" : NumberLong(0), "output" : NumberLong(4) }, "timeMillis" : 321, "timing" : { "shardProcessing" : 68, "postProcessing" : 253 }, "shardCounts" : { "stats2/192.168.…:27017,…" : { "input" : 2, "emit" : 2, "reduce" : 0, "output" : 2 } }, "postProcessCounts" : { "stats1/192.168.…:27017,…" : { "input" : NumberLong(2), "reduce" : NumberLong(0), "output" : NumberLong(2) }, "stats2/192.168.…:27017,…" : { "input" : NumberLong(2), "reduce" : NumberLong(0), "output" : NumberLong(2) } }, "ok" : 1, }

Al ejecutar de nuevo el script con la misma entrada que vuelve a mostrar en la segunda colección, muestra que se está reduciendo en postProcessCounts. Entonces, las funciones de mapa y reducir hacen bien su trabajo. ¿Por qué no funciona en la primera colección más grande? ¿Estoy haciendo algo mal aquí? ¿Existen limitaciones especiales en las colecciones que se pueden usar como salida para map-reduce?


mapReduce se ejecuta en 2 registros, lo que da como resultado 2 registros entregados. Sin embargo, en el postProcessCounts para ambos fragmentos el conteo de entrada permanece en 0.

El mapa se ejecuta en 2 registros. Si esos dos registros tienen una clave diferente, el mapa generará 2 claves y un valor para cada una. Que es normal

Pero algo que noté en una versión anterior de MongoDB (no estoy seguro de si esto aplica en su caso) es que si la "matriz de valores" para la fase de reducción tiene una longitud, entonces la reducción será omitida.

¿La colección de salida está vacía en el primer caso?