2017-03-21 8 views
1

現在、私はfilePrefixに基づいてグループ化し、max fileIdでレコードを取得できます。MongoアグリゲーションのfilePrefixでグループ化するときにfileNameを投影する方法

出力では、filePrefixとfileIdを取得できましたが、fileNameとfileIdを取得できませんでした。

誰もが...これについて

マイドキュメント私を助けてくださいすることができ:

{ 
      "_id" : ObjectId("58cbe224238b3953da3bc0bc"), 
      "fileName" : "samplefile1_124.txt", 
      "filePrefix":"samplefile1", 
      "fileId":124 
    } 
    { 
      "_id" : ObjectId("58cbe257238b3953da3bc0bd"), 
      "fileName" : "samplefile2_125.txt", 
      "filePrefix":"samplefile2", 
      "fileId":125 

    } 
    { 
      "_id" : ObjectId("58cf8d13f731b796bc343726"), 
      "fileName" : "samplefile3_126.dat", 
      "filePrefix":"samplefile3", 
      "fileId":126 
    } 
    { 
      "_id" : ObjectId("58cfa525f731b796bc343727"), 
      "fileName" : "samplefile1_126.txt", 
      "filePrefix":"samplefile1", 
      "fileId":126 
    } 
    { 
      "_id" : ObjectId("58cfa525f731b796bc343728"), 
      "fileName" : "samplefile2_127.txt", 
      "filePrefix":"samplefile2", 
      "fileId":127 

    } 

マイコード:

MongoClient mongo = new MongoClient("localhost",27017); 
    MongoDatabase db = mongo.getDatabase("fileDB"); 
    MongoCollection<Document> col = db.getCollection("fileStatus"); 

    List<String> docsList = new ArrayList<>(); 
    docsList.add("samplefile1"); 
    docsList.add("samplefile2"); 
    docsList.add("samplefile3"); 

    Set<String> docsSet = new HashSet<>(); 
    for(String st: docsList){ 
     docsSet.add(st); 
     } 

    Document match = new Document("$match", new Document("filePrefix",new Document("$in",docsSet))); 
    Document group = new Document("$group" , new Document("_id","$filePrefix").append("fId", new Document("$max","$fileId"))); 
    Document project = new Document("$project",new Document("filePrefix","$_id").append("fileId", "$fId")); 

    AggregateIterable<Document> output = col.aggregate(Arrays.asList(match,group,project)); 

     for (Document dbObject : output) 
     { 
      System.out.println(dbObject); 
     } 

マイ出力:

ドキュメントを{ {_id = samplefile1、filePrefix = samplefile1、fileId = 126.0 }}
ドキュメント{{_ ID = samplefile2、filePrefix = samplefile2、FILEID = 127.0}}
ドキュメント{{_ ID = samplefile3、filePrefix = samplefile3、FILEID = 126.0}}

+0

使用 '$ first'またはグループステージ内のファイル名で' $のlast'として翻訳

db.test.aggregate([ { "$match": { "filePrefix": { "$in": docsSet } } }, { "$sort": { "filePrefix": 1, "fileId": -1 } }, { "$group": { "_id": "$filePrefix", "fileId": { "$first": "$fileId"}, "fileName": { "$first": "$fileName"} } } ]) 

としてサンプル文書を使用して、例えば

。 '.append(" fileName "、新しいドキュメント(" $ first "、" $ fileName ")'のようなもの)orderを制御したい場合は、グループの前にsort stageを使用してください。 – Veeram

+0

最初のfileNameは必要ありません。 maxIdの出力に表示されるfileName – dev777

+1

@Veeramは、2番目のパイプラインステップとして 'fileId'によって' $ sort'を昇順にし、 '$ group'ステップで' $ last'を使用して 'fileName 'とすると、最大ファイルIDに関連付けられたファイル名になります。 – richsilv

答えて

0
あなたが実行する必要があると思い

$first(降順の場合)または$last(昇順の場合)演算子を使用する必要があるため、グループ演算を適用する前にドキュメントを並べ替える次の集計パイプラインは、他のフィールドを返す必要があります。これは本質的に最大フィールドと対応するドキュメントフィールドを提供します。入力すなわち

Document match = new Document(
    "$match", new Document("filePrefix", 
     new Document("$in", docsSet) 
    ) 
); 
Document sort = new Document("$sort", 
    new Document("filePrefix", 1).append("fileId", -1) 
); 
Document group = new Document("$group" , 
    new Document("_id", "$filePrefix") 
     .append("fileId", new Document("$first", "$fileId") 
     .append("fileName", new Document("$first", "$fileName") 
    ) 
); 
Document project = new Document("$project", 
    new Document("filePrefix", "$_id") 
     .append("fileId", 1) 
     .append("fileName", 1) 
); 
+1

ありがとうございました。 – dev777

関連する問題