2017-03-17 13 views
2

私は次のようなコレクションを持っています。このコレクションにユーザーと問い合わせています。MongoDB Java Driverの配列フィールドを使用したプロジェクト

{ 
     "user": "username", 
     "sites": { 
     "site": "abc", 
     "keywords": [ 
      { 
      "keyword": "keyword1", 
      "dailyranks": [ 
       { 
       "fild1": "value1" 
       }, 
       { 
       "fild2": "value2" 
       }, 
       { 
       "fild3": "value3" 
       }, 
      ] 
      }, 
      { 
      "keyword": "keyword2", 
      "dailyranks": [ 
       { 
       "fild1": "value1" 
       }, 
       { 
       "fild2": "value2" 
       }, 
       { 
       "fild3": "value3" 
       }, 
      ] 
      }, 
     ], 
     } 
    } 

私は次のようにコレクションから結果を取得したいが、私は、集約$プロジェクトを使用しているコレクション

[ 
    { 
     "keyword" : "keyword1" 
     "fild2" : "value2", 
     "fild3" : "value3" 
    }, 
    { 
     "keyword" : "keyword2" 
     "fild2" : "value2", 
     "fild3" : "value3" 
    }, 
] 

にキーワード配列の最後の要素を取得したいが、didnのうまくいきません。これを整理するのを助けてください。

コードは、集計の下に試すことができ

BasicDBObject siteObject = new BasicDBObject(); 
siteObject.append("keywords", "$sites.keywords.keyword"); 
siteObject.append("lastrank", "$sites.keywords.dailyranks"); 

BasicDBList aDBList = new BasicDBList(); 
aaa.add(new BasicDBObject("user", modelLogin.getUSER_NAME())); 

ArrayList<BasicDBObject> doc = new ArrayList<>(); 
doc.add(new BasicDBObject().append("$unwind", "$sites")); 
doc.add(new BasicDBObject("$match", aDBList)); 
doc.add(new BasicDBObject().append("$project", siteObject)); 
AggregationOutput output = coll.aggregate(doc); 
+0

同等のJavaのあなたがあなたの集約と$のプロジェクトで、これまでに試したかを示すことはできますか? –

+0

@VinceBowdren質問はソースコード に更新ありがとう –

+0

しかしそこに$ project節はないようですか? –

答えて

1

をused-。

$mapを使用してKeywordsアレイを変換します。 $map

$arrayAtElemからの結果を保持しfild値を投影するdailyranks$letオペレータから最後と最後から二番目の値を投影する$arrayElemAtを使用します。

db.coll.aggregate({ 
    $project: { 
     keywords: { 
      $map: { 
       input: "$sites.keywords", 
       as: "result", 
       in: { 
        keyword: "$$result.keyword", 
        fild2: {$let: {vars: {obj: {$arrayElemAt: ["$$result.dailyranks", -2]}},in: "$$obj.fild2"}}, 
        fild3: {$let: {vars: {obj: {$arrayElemAt: ["$$result.dailyranks", -1]}},in: "$$obj.fild3"}} 
       } 
      } 
     } 
    } 
}) 

MongoClient mongoClient = new MongoClient(); 
MongoDatabase db = mongoClient.getDatabase("db") 
MongoCollection<Document> collection = db.getCollection("collection"); 
List<Document> results = 
    collection.aggregate(
     Arrays.asList(
      Aggregates.match(Filters.eq("user", modelLogin.getUSER_NAME())), 
      Aggregates.project(
       Projections.fields(
        new Document("keywords", 
         new Document("$map", 
         new Document("input", "$sites.keywords"). 
         append("as", "result"). 
         append("in", 
          new Document("keyword","$$result.keyword"). 
           append("fild2", 
            new Document("$let", 
            new Document("vars", new Document("obj", 
              new Document("$arrayElemAt", Arrays.asList("$$result.dailyranks", -2)))). 
            append("in", "$$obj.fild2"))). 
           append("fild3", 
            new Document("$let", 
            new Document("vars", new Document("obj", 
              new Document("$arrayElemAt", Arrays.asList("$$result.dailyranks", -1)))). 
            append("in", "$$obj.fild3"))) 
          ) 
         ) 
        ))) 
     )).into(new ArrayList<>()); 
+0

@veerram –

+0

値を投影するのに使います。更新しました。 Moremore http://mongodb.github.io/mongo-java-driver/3.4/javadoc/?com/mongodb/client/model/Projections.html – Veeram

+0

のようなコンパイルエラーが発生しました aggregate(List ) メソッドDBCollection.aggregate(DBObject、DBObject ...)は適用されません –

関連する問題