使用MongoDB的MapReduce Java驱动程序错误的BSONElement断言类型错误

时间:2011-09-05 09:44:58

标签: java mongodb mapreduce

我是MongoDB和MapReduce的新手。我需要在我的数据库中对集合执行一些MapReduce。 MAPREDUCE_MAX函数有效,因为我能够在Mongo交互式shell(v.1.8.2)中完成我的需求。但是,使用Mongo Java Driver(v.2.6.3)

尝试执行相同的操作时出错

我的MAPREDUCE_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 个答案:

答案 0 :(得分:4)

今天我偶然发现了我的错误并想在这里分享解决方案,以防有人遇到类似的问题。

调用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只允许outputTargetOutputType设置为{{1}时可以为空(根据INLINE的Javadoc)。

所以我所要做的就是将第三个参数从MapReduceCommand.getOutputTarget()更改为某个null,如下所示:

String

这就像我在尝试弄清楚它为什么不起作用时没有玩过的唯一参数。我希望有人可能会觉得这很有用。

答案 1 :(得分:3)

您可能还想尝试:

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

如果您想要一个内联集合而不给它起名字