2016-02-10 180 views
2

我正在使用mongodb.I必須在我的彈簧數據mongo db中爲$ date使用聚合查詢。這是我的用戶集合。

{ 
    "_id" : NumberLong(70289), 
    "_class" : "com.samepinch.domain.user.User", 
    "age" : 25, 
    "roles" : [ 
     "ROLE_MODERATOR", 
     "ROLE_USER" 
    ], 
    "firstName" : "Abhi", 
    "lastName" : "Saini", 
    "email" : "[email protected]", 
    "createdDate" : ISODate("2015-12-04T12:29:57.604Z"), 
    "updatedDate" : ISODate("2016-02-10T06:23:13.314Z") 
} 

這是我的MongoDB查詢

db.users.aggregate([{ $project : { month_joined : { $month : "$createdDate" } } } ,{ $group : { _id : {month_joined:"$month_joined"} , number : { $sum : 1 } } },{ $sort : { "_id.month_joined" : 1 } }]) 

查詢給了我希望的結果爲:

{ "_id" : { "month_joined" : 1 }, "number" : 19 } 
{ "_id" : { "month_joined" : 2 }, "number" : 7 } 
{ "_id" : { "month_joined" : 9 }, "number" : 16 } 
{ "_id" : { "month_joined" : 10 }, "number" : 12 } 
{ "_id" : { "month_joined" : 11 }, "number" : 11 } 
{ "_id" : { "month_joined" : 12 }, "number" : 13 } 

現在我必須寫使用mongotemplate春天的mongodb數據這個查詢。我是使用聚合的新手,他們是使用它的簡單方法。請幫忙

謝謝。

回答

1

您可以嘗試通過在投影操作使用SpEL andExpression然後組由組操作中的新字段第一突出的字段:

Aggregation agg = newAggregation(
    project("id").andExpression("month(createdDate)").as("month_joined"), 
    group("month_joined").count().as("number"), 
    project("number").and("month_joined").previousOperation(), 
    sort(ASC, "number") 
); 

AggregationResults<JoinCount> results = mongoTemplate.aggregate(agg, 
                "collectionName", JoinCount.class); 
List<JoinCount> joinCount = results.getMappedResults(); 

在上述經由新的聚合newAggregation創建了一個靜態工廠方法,您可以向其傳遞聚合操作列表。這些聚合操作定義了聚合的聚合管道。

在第一步中,您通過使用SpEL andExpression與項目操作來投影輸入集合中的字段。

在第二步中,您使用組操作爲每個"month_joined"定義一個組,並通過count()彙總運算符彙總出現次數,並將結果收集到名爲"number"的新字段中。

作爲第三步驟選擇字段"number"並創建具有名稱"month_joined"從前一組操作而生成的_id -field(因此調用previousOperation())的別名。

作爲第四步排序產生的分組month_joined文件通過其發生的列表,經由排序操作升序計數。

最後調用aggregate() MongoTemplate上的方法,以便讓MongoDB以創建的Aggregation作爲參數執行實際的聚合操作。


要過濾的文件獲得在管道本年度,你需要項目保存日期的年份部分一個新的領域和項目後一步然後發出匹配運營商,像

Aggregation agg = newAggregation(
    project("id") 
     .andExpression("month(createdDate)").as("month_joined") 
     .andExpression("year(createdDate)").as("year"), 
    match(Criteria.where("year").is(2016)), 
    group("month_joined").count().as("number"), 
    project("number").and("month_joined").previousOperation(), 
    sort(ASC, "number") 
); 

AggregationResults<JoinCount> results = mongoTemplate.aggregate(agg, 
                "collectionName", JoinCount.class); 
List<JoinCount> joinCount = results.getMappedResults(); 
+0

當我使用項目()。 andExpression()。它要求我和表達式(字符串表達式,對象參數)。根據你的回答,我不知道如何使用它? –

+0

如前所示,您是否嘗試使用'.andExpression(「month(createdDate)」)'而不是'.andExpression(「month(date)」)? – chridam

+0

其實.andExpression()是要求兩個參數我。e和表達式(字符串表達式,對象參數)。我很困惑傳遞什麼。 –

相關問題