java - mongodb java 驱动程序 - 无法在 map 函数中使用 split

标签 java mongodb

我有一个表格,其中包含格式为

的文档
{
  "_id" : ObjectId("55867f3bfe2b0bea9c634ded"),
  "Best Site CR GU Party ID" : 14783,
  "Best Site CR GU Party Name" : "AUTOMOBILE INSURANCE COMPANY",
  "Product ID" : "C5500",
  "Product Family" : "C5000",
  "Product Description" : "5500 Chassis",
  "Best Site CR Party ID" : 45714558,
  "Best Site CR Party Name" : "INSURANCE COMPANY",
  "LDoS" : "4/27/2008",
  "LDoS FY" : 2008,
  "List Price $" : 3495,
  "Collector View" : "No"
}

我正在使用 mongodb java 驱动程序 3.0.2。目的是汇总集合中每年每个月的价格和文档数量。我为 map 创建了以下函数,该函数在 MongoVUE 上运行,但在 java 驱动程序中失败:

function Map() {
    var currentYr = new Date().getFullYear();
    var ldosMonth = this['LDoS'].split(/[//-]/)[0].replace(/^0+/, '');
    var key = {partyId: this['Best Site CR GU Party ID'], year: this['LDoS FY'], month: parseInt(ldosMonth)};

    emit(key, {price: this['List Price $'], count: 1});
}

Exception in thread "main" com.mongodb.MongoCommandException: Command failed with error 16722: 'exception: TypeError: Object 42582 has no method 'split'
    at Map (_funcs1:1:99) near '['LDoS']).split(/[//-]/)[0].replace(/^0+/' ' on server localhost:27017. The full response is { "errmsg" : "exception: TypeError: Object 42582 has no method 'split'\n    at Map (_funcs1:1:99) near '['LDoS']).split(/[//-]/)[0].replace(/^0+/' ", "code" : 16722, "ok" : 0.0 }
    at com.mongodb.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:77)

我该如何解决这个问题?为了完整起见,这里是reduce函数:

function Reduce(key, values) {
    var reduced = {price:0, count:0};

    values.forEach(function(val) {
        reduced.price += val.price;
        reduced.count += val.count; 
    });

    return reduced;
}

 String map = "function Map() {" +
            "var currentYr = new Date().getFullYear();" +
            "var ldosMonth = (this['LDoS']).split(/[//-]/)[0].replace(/^0+/, ''); " + // trim leading zero
            "var key = {partyId: this['Best Site CR GU Party ID'], year: this['LDoS FY'], month: parseInt(ldosMonth)};" +
            "var objToEmit = {price: this['List Price $'], count: 1};" +
            "emit(key, objToEmit);" +               
        "}";

        String reduce = "function Reduce(key, values) {" +
            "var reduced = {price:0, count:0};" +

            "values.forEach(function(val) {" +
                "reduced.price += val.price;" +
                "reduced.count += val.count;" + 
            "});" +

            "return reduced;" + 
        "}";

        MapReduceIterable<Document> output = dbCollection.mapReduce(map, reduce);

最佳答案

我通过将 mapReduce 调用重构为

来实现此功能
MapReduceIterable<Document> output = dbCollection.mapReduce(map, reduce)
                .finalizeFunction("function Finalize(key, reduced) {return reduced;}")
                .filter(Filters.and(new BasicDBObject("Best Site CR GU Party ID", guCrPartyId), Filters.or(new BasicDbObject("LDoS FY", 2015), new BasicDbObject("LDoS FY", 2016),new BasicDbObject("LDoS FY", 2017))
                .action(MapReduceAction.REPLACE);

关于java - mongodb java 驱动程序 - 无法在 map 函数中使用 split,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30964176/

相关文章:

java - iText:通过投影变换添加图像

java - 将 J2SE 应用程序与 Web 应用程序集成的最简单方法

MongoDB - 在连接字段上包含(LIKE)查询

java - 在 MongoDB Map Reduce 函数中查询

node.js - Mongoose 多重深度填充

java - 文本完全展开后的 SWT 水平线

java mysql 数据库使用准备好的语句插入

node.js - MongoDB连接不断增加

grails - Grails服务MongoDB

java - 如果在线程中 InterruptedException 的 catch block 内使用 "return",它会在哪里返回?