MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MapReduce usando o MongoDB Java Driver falha com tipo errado para declaração BSONElement


Hoje me deparei com meu erro e resolvi compartilhar a solução aqui, caso alguém encontre um problema semelhante.

A invocação do mapReduce método estava causando o problema:
MapReduceOutput sum = collection
                .mapReduce(MAP, REDUCE_MAX, null, null);

Dê uma olhada no 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
 */

Ele afirma que o comando é executado usando REPLACE como modo de saída e que se alguém quiser uma coleção temporária, o outputTarget deve ser null .

Infelizmente, porém, o construtor MapReduceCommand , que é usado no mapReduce método, permite apenas o outputTarget para ser anulável se o OutputType está definido como INLINE (de acordo com o Javadoc de MapReduceCommand.getOutputTarget() ).

Então tudo que eu tive que fazer é mudar o terceiro parâmetro de null para algum String , igual a:
MapReduceOutput sum = collection
                .mapReduce(MAP, REDUCE_MAX, "tmp", null);

Este era o único parâmetro com o qual eu não havia brincado enquanto tentava descobrir por que não funcionava. Espero que alguém possa achar isso útil.