sql >> Base de Datos >  >> NoSQL >> MongoDB

MapReduce usando MongoDB Java Driver falla con un tipo incorrecto para la aserción BSONElement

Hoy me topé con mi error y pensé en compartir la solución aquí, en caso de que alguien encuentre un problema similar.

La invocación del mapReduce El método estaba causando el problema:

MapReduceOutput sum = collection
                .mapReduce(MAP, REDUCE_MAX, null, null);

Eche un vistazo al Javadoc para este método:

/**
 * performs a map reduce operation
 * Runs the command in REPLACE output mode (saves to named collection)
 *
 * @param map
 *            map function in javascript code
 * @param outputTarget
 *            optional - leave null if want to use temp collection
 * @param reduce
 *            reduce function in javascript code
 * @param query
 *            to match
 * @return
 * @throws MongoException
 * @dochub mapreduce
 */

Indica que el comando se ejecuta usando REPLACE como modo de salida y que si uno quiere una colección temporal, el outputTarget debe ser null .

Lamentablemente, sin embargo, el constructor MapReduceCommand , que se utiliza en mapReduce método, solo permite el outputTarget ser anulable si el OutputType se establece en INLINE (según el Javadoc de MapReduceCommand.getOutputTarget() ).

Así que todo lo que tenía que hacer era cambiar el tercer parámetro de null a alguna String , así:

MapReduceOutput sum = collection
                .mapReduce(MAP, REDUCE_MAX, "tmp", null);

Este era el único parámetro con el que no había jugado mientras intentaba averiguar por qué no funcionaba. Espero que alguien pueda encontrar esto útil.