Spring Data Mongo MapReduce javascript没有被转义

时间:2014-03-31 12:47:52

标签: java spring spring-data-mongodb

我正在尝试使用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 \ n \ t \ t \等等。我使用这个在线工具http://jscompress.com/将文件压缩成一行。然后加载文件但我收到错误:

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

引起:com.mongodb.CommandFailureException:{“serverUsed”:“/ 127.0.0.1:27017”,“ok”:0.0,“errmsg”:“ns不存在”}     at 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);

感谢任何帮助或想法。

1 个答案:

答案 0 :(得分:2)

我快速浏览了一下。不幸的是,我无法重现你的问题。 您使用的是哪个版本的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());
}