2017-03-17 34 views
2

我有如下集合。我通過用戶查詢此集合。在MongoDB中使用數組字段的項目Java驅動程序

{ 
     "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" 
    }, 
] 

在我已合計使用$項目,但沒不行。幫我解決這個問題。

代碼used-

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

你能告訴到目前爲止,你已經嘗試了什麼,你的聚集和$項目? –

+0

@VinceBowdren更新了源代碼 謝謝 –

+0

但是在那裏似乎沒有$ project子句? –

回答

1

你可以試試下面聚集。使用$map來變換Keywords數組。

$map,使用$arrayElemAtdailyranks$let操作項目的最後一個和倒數第二個值從$arrayAtElem保存結果和項目的fild值。

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"}} 
       } 
      } 
     } 
    } 
}) 

相當於Java

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是什麼目的Aggregates.project()中的「fields」。有編制錯誤 –

+0

這是用來投影值。更新。更多這裏http://mongodb.github.io/mongo-java-driver/3.4/javadoc/?com/mongodb/client/model/Projections.html – Veeram

+0

得到這樣的編譯錯誤, 沒有合適的方法找到聚合(列表) 方法DBCollection.aggregate(DBObject,DBObject ...)不適用 –

相關問題