我正在尝试使用Spring Data Mongo按照文档
运行mapReducehttp://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);
感谢任何帮助或想法。
答案 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());
}