MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MapReduce utilisant MongoDB Java Driver échoue avec un type incorrect pour l'assertion BSONElement

Aujourd'hui, je suis tombé sur mon erreur et j'ai pensé partager la solution ici, juste au cas où quelqu'un rencontrerait un problème similaire.

L'invocation de mapReduce méthode était à l'origine du problème :

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

Jetez un oeil à la Javadoc pour cette méthode :

/**
 * 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
 */

Il indique que la commande est exécutée en utilisant REPLACE comme mode de sortie et que si l'on veut une collection temporaire, le outputTarget doit être null .

Malheureusement, le constructeur MapReduceCommand , qui est utilisé dans le mapReduce méthode, n'autorise que le outputTarget être nullable si le OutputType est défini sur INLINE (selon le Javadoc de MapReduceCommand.getOutputTarget() ).

Donc tout ce que j'avais à faire est de changer le troisième paramètre de null à une String , comme ceci :

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

C'était comme le seul paramètre avec lequel je n'avais pas joué en essayant de comprendre pourquoi cela ne fonctionnait pas. J'espère que quelqu'un trouvera cela utile.