使用MongoDB Java驱动程序的MapReduce因BSOneElement断言类型错误而失败
我对MongoDB和MapReduce很陌生。我需要在数据库中的集合上执行一些MapReduce。{
我的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的类型是错误的。我已经在谷歌上搜索过了。我也检查了MongoDB日志,但没有发现任何线索
有人知道我可能错过了什么/做错了什么吗?如果你们需要更多的细节,请告诉我
# 1 楼答案
你可能还想试试:
如果你想拥有一个内联集合而不给它命名
# 2 楼答案
今天,我偶然发现了我的错误,想在这里分享解决方案,以防有人遇到类似的问题
调用
mapReduce
方法导致了以下问题:请查看此方法的Javadoc:
它声明命令是使用
REPLACE
作为输出模式执行的,如果需要临时集合,则outputTarget
应该是null
然而不幸的是,在
mapReduce
方法中使用的构造函数MapReduceCommand
只允许outputTarget
在OutputType
设置为INLINE
时为空(根据MapReduceCommand.getOutputTarget()
的Javadoc)所以我要做的就是把第三个参数从
null
改成String
,如下所示:这是我在试图找出它为什么不起作用时唯一没有使用的参数。我希望有人会觉得这很有帮助