java - 使用 MongoDB Java API 执行 MapReduce 命令时出错

标签 java mongodb

我正在测试 MongoDB Java API,我想做一个 mapReduce。 我的实现如下:

String map = "function() { " +
    "emit(this.ts, this.1_bid);}";

String reduce = "function(key, values) {" +
    "return Array.sum(values);}";

MapReduceCommand cmd = new MapReduceCommand(collection, map, reduce, null, MapReduceCommand.OutputType.INLINE, null);
MapReduceOutput out = collection.mapReduce(cmd);

for (DBObject o : out.results()) {
    System.out.println(o.toString());
}

但是当我执行它时,我有以下异常堆栈:

[tick_engine] 16:51:53.600 ERROR [MongoTickDataReader] Failed to read data from mongoDB
com.mongodb.CommandFailureException: { "serverUsed" : "/127.0.0.1:27017" , "errmsg" : "exception: SyntaxError: Unexpected token ILLEGAL" , "code" : 16722 , "ok" : 0.0}
    at com.mongodb.CommandResult.getException(CommandResult.java:71) ~[mongo-2.11.1.jar:na]
    at com.mongodb.CommandResult.throwOnError(CommandResult.java:110) ~[mongo-2.11.1.jar:na]
    at com.mongodb.DBCollection.mapReduce(DBCollection.java:1265) ~[mongo-2.11.1.jar:na]
    at com.smarttrade.tickEngine.in.MongoTickDataReader.mapReduce(MongoTickDataReader.java:321) ~[classes/:na]
    at com.smarttrade.tickEngine.in.MongoTickDataReader.readData(MongoTickDataReader.java:157) ~[classes/:na]
    at com.smarttrade.tick.engine.TickEngine.onMarketDataRequest(TickEngine.java:203) [classes/:na]
    at com.smarttrade.tick.sttp.TickMarketDataRequestCommand.execute(TickMarketDataRequestCommand.java:62) [classes/:na]
    at com.smarttrade.st.commands.Command.process(Command.java:140) [src/:na]
    at com.smarttrade.st.server.STTPInvoker$1.process(STTPInvoker.java:385) [src/:na]
    at com.smarttrade.st.server.STTPInvoker$1.process(STTPInvoker.java:1) [src/:na]
    at com.smarttrade.util.concurrent.queue.MultiSessionsBlockingQueue$SimpleSession.run(MultiSessionsBlockingQueue.java:122) [src/:na]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_51]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_51]
    at java.lang.Thread.run(Thread.java:744) [na:1.7.0_51]

最佳答案

问题似乎出在您定义的属性名称 - 1_bid

我创建了示例文档来测试您的map-reduce -

{ "_id" : ObjectId("533ef7d0e1687dd644410d88"), "ts" : "TSKEY", "1_bid" : 200 }
{ "_id" : ObjectId("533ef7d3e1687dd644410d89"), "ts" : "TSKEY", "1_bid" : 300 }
{ "_id" : ObjectId("533ef7d5e1687dd644410d8a"), "ts" : "TSKEY", "1_bid" : 400 }
{ "_id" : ObjectId("533ef7dce1687dd644410d8b"), "ts" : "TSKEY2", "1_bid" : 800 }
{ "_id" : ObjectId("533ef7dfe1687dd644410d8c"), "ts" : "TSKEY2", "1_bid" : 300 }

我运行了以下map-reduce命令 -

db.sample4.mapReduce(function() { emit(this.ts, this.1_bid);},function(key, values) {return Array.sum(values);})

我得到的错误是SyntaxError: Missing ) after argument list (shell):1

我意识到,映射器正在执行的函数是一个 JavaScript 函数,在 JavaScript 中,你不能有一个以数字开头的变量。因此你会得到一个语法错误。然后我创建了一组新文档 -

{ "_id" : ObjectId("533eff29e1687dd644410d8d"), "ts" : "TSKEY", "bid_1" : 200 }
{ "_id" : ObjectId("533eff2de1687dd644410d8e"), "ts" : "TSKEY", "bid_1" : 300 }
{ "_id" : ObjectId("533eff34e1687dd644410d8f"), "ts" : "TSKEY", "bid_1" : 400 }
{ "_id" : ObjectId("533eff7fe1687dd644410d92"), "ts" : "TSKEY2", "bid_1" : 800 }
{ "_id" : ObjectId("533eff85e1687dd644410d93"), "ts" : "TSKEY2", "bid_1" : 300 }

然后修改映射器以使用“bid_1”并运行以下命令 -

db.sample4.mapReduce(function() { emit(this.ts, this.bid_1);},function(key, values) {return Array.sum(values);},"pivot")

输出是 - { “结果”:“枢轴”, “时间米利斯”:61, “计数”:{ “输入”:12, “发射”:12, “减少”:2, “输出”:2 }, “好的”:1, }

db.pivot.find()
{ "_id" : "TSKEY", "value" : 900 }
{ "_id" : "TSKEY2", "value" : 1100 }

我使用您粘贴的同一程序在 Java 中对此进行了测试,只需将属性名称更改为 “bid_1” 并且它有效

关于java - 使用 MongoDB Java API 执行 MapReduce 命令时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22866160/

相关文章:

java - 在 Java 中创建新的对象列表会引发 NullPointerException

java - 集合获取连接

java - 通过外部 java 类更新 TextView

mongodb - 在 MongoDB 聚合中对嵌套字段使用 $multiply

javascript - 对象的 Mongoose 部分更新

MongoDB 聚合 : Project an array without the first element

java - Spring JPA 存储库最近日期

java - 如何让 JavaFX 控件在初始化后立即实现它的 localBounds?

javascript - meteor 服务器无需登录即可插入数据

java - 使用 Jackson 与 Java Mongo DBObject 进行高效 POJO 映射