MapReduce, использующий драйвер Java MongoDB, ошибается с неверным типом для утверждения BSONElement - PullRequest
1 голос
/ 05 сентября 2011

Я довольно новичок в MongoDB и MapReduce.Мне нужно сделать несколько MapReduce для коллекции в моей БД.Функции MAP и REDUCE_MAX работают, поскольку я смог удовлетворить свои потребности в интерактивной оболочке Mongo (v.1.8.2).Однако я получаю сообщение об ошибке при попытке выполнить то же самое с помощью драйвера Mongo Java (v. 2.6.3)

Мои MAP и REDUCE_MAX функции выглядят так:

String MAP =
            "function(){" +
                    "if(this.type != \"checkin\"){return;}" +
                    "if(!this.venue && !this.venue.id){return;}" +
                    "emit({userId:this.userId, venueId:this.venue.id}, {count:1});" +
                    "};";


String REDUCE_MAX =
            "function(key, values){" +
                    "var res = {count:0};" +
                    "values.forEach(function(value){result.count += value.count;});" +
                    "return res;" +
                    "};";

Это команда, которую я выполняю:

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

Это ошибка, которую я получаю:

com.mongodb.CommandResult$CommandFailure: command failed [command failed [mapreduce] { "assertion" : "wrong type for BSONElement (replace) 10 != 2" , "assertionCode" : 13111 , "errmsg" : "db assertion failure" , "ok" : 0.0}

Я не знаю, какой BSONElement имеет неправильный тип.И я уже погуглил assertionCode: 13111.Я также проверил в журнале MongoDB, но не нашел там никаких подсказок.

У кого-нибудь есть идеи, что я мог упустить / сделать неправильно?Если вам, ребята, нужно больше подробностей, просто дайте мне знать, пожалуйста.

Ответы [ 2 ]

4 голосов
/ 15 сентября 2011

Сегодня я наткнулся на свою ошибку и решил поделиться здесь решением, на случай, если кто-нибудь столкнется с подобной проблемой.

Вызов метода mapReduce вызвал проблему:

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

Посмотрите на Javadoc для этого метода:

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

В нем говорится, что команда выполняется с использованием REPLACE в качестве режима вывода и что, если требуется временная коллекция, outputTarget должно быть null.

К сожалению, однако, конструктор MapReduceCommand, который используется в методе mapReduce, позволяет обнулять outputTarget, только если OutputType установлен в INLINE (согласно Javadoc MapReduceCommand.getOutputTarget()). * * тысяча двадцать-один

Так что все, что мне нужно было сделать, это изменить третий параметр с null на какой-то String, вот так:

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

Это был единственный параметр, с которым я не играл, пытаясь понять, почему он не работает. Я надеюсь, что кто-то может найти это полезным.

3 голосов
/ 11 декабря 2011

Вы также можете попробовать:

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

, если вы хотите иметь встроенную коллекцию без указания имени

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...