【问题标题】:MapReduce using MongoDB Java Driver failes with wrong type for BSONElement assertion使用 MongoDB Java 驱动程序的 MapReduce 因 BSONElement 断言的类型错误而失败
【发布时间】:2011-09-05 09:44:58
【问题描述】:

我对 MongoDB 和 MapReduce 还是很陌生。我需要对我的数据库中的集合做一些 MapReduce。 MAP 和 REDUCE_MAX 函数有效,因为我能够在 Mongo 交互式 shell (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 日志,但没有找到任何线索。

有没有人知道我可能遗漏了什么/做错了什么?如果你们需要更多详细信息,请告诉我。

【问题讨论】:

    标签: java mongodb mapreduce


    【解决方案1】:

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

    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。

    不幸的是,mapReduce 方法中使用的构造函数MapReduceCommand 仅在将OutputType 设置为INLINE 时才允许outputTarget 可以为空(根据@987654332 的Javadoc @)。

    所以我要做的就是将第三个参数从null 更改为String,如下所示:

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

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

    【讨论】:

      【解决方案2】:

      您可能还想尝试:

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

      如果你想有一个内联集合而不给它一个名字

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-28
        • 2022-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-18
        • 1970-01-01
        相关资源
        最近更新 更多