2014-04-04 36 views
1

我正在測試MongoDB Java API,我想做一個mapReduce。 我實現它如下: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

這個問題似乎與您所定義的屬性名稱 - 1_bid

我創建了示例文檔來測試您的地圖 - 減少 -

{ "_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") 

產量爲 - { 「結果」:「支點」 , 「timeMillis」:61, 「計數」:{ 「輸入」:12, 「發射」:12, 「減少」:2, 「輸出」:2 }, 「OK」:1, }

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

我使用你已經粘貼,只是改變了屬性名稱"bid_1"同一程序測試此Java和它的工作

0

爲了防止現場語法錯誤名稱,你也可以這樣寫地圖功能:

function() { 
    emit(this["ts"], this["1_bid"]); 
}