2016-09-13 22 views
0

私はmongodbを使用していて、文書のフォーム配列にログデータを保存したいとします。コレクションからの読み取り中に 私は集約パイプラインを使用しています。 Mongo Boosterでクエリを使用するのがうまくいきませんでしたが、クエリは正常に動作していますが、Javaプログラムで使用しようとすると に次の例外があります。集約:com.mongodb.MongoCommandException:コマンドがエラーで失敗しました16436:

詳細: - > db.version() - 3.2.7 - >モンゴ-java_driver:3.2.2

Query in Mongo Booster: 
======================= 
db.logCollection.aggregate({$unwind:'$logList'},{ $sort : {'logList.log.timestamp': -1} },{ $match:{'logList.log.userId': "100100"}},{ $group: {_id: null, logList: {$push: '$logList'}}},{ $project: { _id: 0,logList: {log:{timestamp: 1,operation:1}}}}).pretty() 

Query: using Java 
================= 

DBObject unwindField = new BasicDBObject("$unwind", "$logList"); 
    DBObject groupFields = new BasicDBObject("_id", null);   
    groupFields.put("logList", new BasicDBObject("$push","$logList")); 
    DBObject group = new BasicDBObject("$group", groupFields); 
    DB logDB = mongoClient.getDB("logdb"); 
    DBCollection collection=logDB.getCollection(collectionName);  
    DBObject skipFields = new BasicDBObject("$skip",skip); 
    DBObject limitFields = new BasicDBObject("$limit",limit); 
    Iterable<DBObject> results =null; 
    try { 
    results= collection.aggregate(unwindField, sortField,searchField,skipFields,limitFields,group,projectFields).results(); 
    } catch (Exception e) { 
    log.error("readLogsFromCollection() Failed"); 

    } 

Exception: 
========== 
com.mongodb.MongoCommandException: Command failed with error 16436: 'Unrecognized pipeline stage name: 'logList.log.timestamp' on server localhost:27017. 
The full response is { "ok" : 0.0, "errmsg" : "Unrecognized pipeline stage name: 'logList.log.timestamp'", "code" : 16436 } 

Input Document: 
================ 

{ 
    "logList" : [ 
     { 
      "log" : { 
       "acctId" : "0", 
       "info1" : { 
        "itemName" : "-", 
        "value" : "-" 
       }, 
       "errorCode" : "", 
       "internalInformation" : "", 
       "kind" : "Infomation", 
       "groupId" : "0", 
       "logId" : "G1_1", 
       "operation" : "startDiscovery", 
       "result" : "normal", 
       "userId" : "100100", 
       "timestamp" : "1470980265729" 
      } 
     } 
    ] 
} 

すべてのボディは、問題が何であるかを教えてもらえ、私が読んで問題はバージョンですが、私はmongo-java_driver-3.3も使用しましたが使用しませんでした。

ありがとうございます。

+0

あなたはで動作するクエリを追加してくださいすることができm Javaでコーディングしようとしているongodbシェル?また、サンプル文書を追加することができれば便利です。 – notionquest

+0

こんにちは@notionquest、更新されたクエリ –

+0

をご覧ください。 – notionquest

答えて

1

以下のMongoDBクエリのJavaコードです。 OPで述べたのと同じJavaドライバ(mongo-java_driver:3.2.2)を使いました。

MongoDBのクエリ: -

db.loglist.aggregate({$unwind:'$logList'}, 
{ $sort : {'logList.log.timestamp': -1} }, 
{ $match:{'logList.log.userId': "100100"}}, 
{ $group: {_id: null, logList: {$push: '$logList'}}}, 
{ $project: { _id: 0,logList: {log:{timestamp: 1,operation:1}}}}).pretty(); 

Javaコード: -

public static void main(String[] args) { 
     MongoClient client = new MongoClient(); 
     MongoDatabase database = client.getDatabase("test"); 

     AggregateIterable<Document> mongoCollectionList = database.getCollection("loglist") 
       .aggregate(Arrays.asList(Aggregates.unwind("$logList"), Aggregates.sort(Sorts.descending("logList.log.timestamp")), 
         Aggregates.match(Filters.eq("logList.log.userId", "100100")), 
         Aggregates.group("$id", Accumulators.push("logList", "$logList")), 
         Aggregates.project(Projections.include("logList.log.timestamp", "logList.log.operation")) 
         )); 

     MongoCursor<Document> mongoCursor = mongoCollectionList.iterator(); 

     while (mongoCursor.hasNext()) { 
      System.out.println(mongoCursor.next().toJson()); 

     } 

    } 

出力: -

{ 
    "_id": null, 
    "logList": [{ 
     "log": { 
      "operation": "startDiscovery", 
      "timestamp": "1470980265729" 
     } 
    }] 
} 
+0

こんにちは@notionnquest、私はdepricated APIを使用しています。私が今使っている古いAPIで動作するようにすることができます –

+0

廃止予定のAPIを使用する理由は何ですか? – notionquest

+0

それはコードのすべての場所にあったので、私は同じで続ける必要があります。それは@notionquestを動作させています。マッチとソートのために集計パイプライン演算子が私のJavaコードで見逃されているので、そのパイプラインは機能しません。今はその仕事。 –

関連する問題