【问题标题】:Spring Data Mongo MapReduce javascript not being escapedSpring Data Mongo MapReduce javascript没有被转义
【发布时间】:2014-05-10 19:32:07
【问题描述】:

我正在尝试按照文档使用 Spring Data Mongo 运行 mapReduce

http://docs.spring.io/spring-data/data-mongodb/docs/1.0.0.M5/reference/html/

我在加载 javascript 文件时遇到了问题。当我包含我的 map.js 和 reduce.js 文件时,会出现换行符,例如 \n\r\t 等。我使用此在线工具 http://jscompress.com/ 将文件压缩为一行。然后加载文件,但出现错误:

org.springframework.dao.InvalidDataAccessApiUsageException:命令执行失败:错误[ns不存在],

原因:com.mongodb.CommandFailureException: { "serverUsed" : "/127.0.0.1:27017" , "ok" : 0.0 , "errmsg" : "ns 不存在"} 在 com.mongodb.CommandResult.getException(CommandResult.java:71) 在 com.mongodb.CommandResult.throwOnError(CommandResult.java:110) 在 org.springframework.data.mongodb.core.MongoTemplate.handleCommandError(MongoTemplate.java:1814) ... 32 更多

我尝试将文件加载为字符串并转义 javascript。相同的 javascript 使用 mongo 驱动程序运行良好,即。

MongoClient mongoClient = new MongoClient("localhost", 27017);
DB db = mongoClient.getDB("product_data");
DBCollection catalogData = db.getCollection("catalogData");
MapReduceCommand cmd = new MapReduceCommand(catalogData, stringMap, stringReduce, "map_reduce_java_test", MapReduceCommand.OutputType.REPLACE, null); 
catalogData.mapReduce(cmd);

这不起作用:

mongoOperations.mapReduce("catalogData", stringMap, stringReduce, new MapReduceOptions().outputCollection("map_reduce_java_test")
        .finalizeFunction(stringFinalize).outputTypeReplace(),
    CatalogItem.class);

感谢任何帮助或想法。

【问题讨论】:

    标签: java spring spring-data-mongodb


    【解决方案1】:

    我快速浏览了一下。不幸的是,我无法重现您的问题。 您使用的是哪个版本的 Spring Data MongoDB? 您指的是 Spring Data MongoDB 的一个相当旧的版本,当前版本是 1.4.1: http://docs.spring.io/spring-data/data-mongo/docs/1.4.1.RELEASE/reference/html/mongo.core.html#mongo.mapreduce

    纯 MongoDriver 和 Spring Data MongoDb 的 M/R 代码似乎不匹配,例如您没有使用 finalizeFunction。 您介意编写一个重现该问题的测试用例吗?

    您可以为此使用 MapReduceTests: https://github.com/spring-projects/spring-data-mongodb/blob/master/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapreduce/MapReduceTests.java#L58

    这是我尝试过的:

    @Test
    public void shoudSupportRunningCompressedJavaScriptAsMapReduceCommands() {
    
        createMapReduceData();
    
        MapReduceResults<ValueObject> results = mongoTemplate.mapReduce(
                "jmr1",
                mapFunction,
                reduceFunction,
                new MapReduceOptions().outputCollection("map_reduce_java_test").outputTypeReplace()
                        .finalizeFunction("function(key,reducedValue){return reducedValue}"), ValueObject.class);
    
        assertThat(results, is(notNullValue()));
    
        Map<String, Float> m = copyToMap(results);
    
        assertEquals(1, m.get("a").intValue());
        assertEquals(2, m.get("b").intValue());
        assertEquals(2, m.get("c").intValue());
        assertEquals(1, m.get("d").intValue());
    }
    

    【讨论】:

    • 您好,非常感谢您的回复。我得到了这个工作, ns 异常意味着找不到命名空间。仍然需要压缩 javascript 文件,但之后使用 classpath:FILENAME 加载它们就可以了。我认为 @Document 字段中的集合名称与作为 MapReduce 参数给出的集合名称不匹配
    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 2016-03-16
    • 2022-01-17
    • 2018-11-02
    • 2019-12-01
    • 2016-10-01
    • 2021-03-16
    • 1970-01-01
    相关资源
    最近更新 更多