2017-05-10 79 views
0

我正在使用彈簧數據mongodb的項目。我正在這樣一個mongo查詢:如何在Criteria中使用mongodb聚合函數?

Query query = new Query(); 

Criteria one = Criteria.where(DB_FIELD_1).gt(1); 
Criteria two = Criteria.where(DB_FIELD_2).lt(10); 

Criteria final = new Criteria().andOperator(one,two); 
query.addCriteria(final); 

// after making the query, I am executing it using mongoTemplate 

現在,我有一個格式爲YYYYMMDD的日期字段。我想檢查它的月份=當前月份。例如,如果該字段爲20170501,則日期的月份(05)爲當前月份(5月5日)。如何從日期提取月份值並檢查此邏輯以及上面的其他條件(一個和兩個)?我知道有$月從日期中提取月份值。但是,我不知道如何將集合函數合併到「標準」類中。我的最終結果應該是這樣的:

Criteria final = new Criteria().andOperator(one,two,criteria to check month = current month); 
query.addCriteria(final); 
+0

日期字段存儲爲字符串的DB? – pvpkiran

+0

將其存儲爲日期 – user3528213

+0

您可以將集合中的示例文檔添加到帖子中嗎?你的spring mongo db版本是什麼?你將需要使用這個投影表達式。 – Veeram

回答

1

您可以在當前的spring db版本1.10.2/Spring 1.5.2 Boot下使用以下聚合管道。包含您希望輸出的$project中的其他字段。

對於3.4 x mongo服務器版本,使用$addFields而不是$project

AggregationOperation project = Aggregation.project().and(DateOperators.dateOf(DB_FIELD_1).month()).as("field1").and(DateOperators.dateOf(DB_FIELD_2).month()).as("field2"); 
AggregationOperation match = Aggregation.match(Criteria.where("field1").gt(1) 
       .and("field2").lt(10)); 
Aggregation aggregation = Aggregation.newAggregation(project, match); 
List<BasicDBObject> results = mongoTemplate.aggregate(aggregation, collectionname, BasicDBObject.class).getMappedResults(); 

使用1.4.1版本

AggregationOperation project = Aggregation.project().and(DB_FIELD_1).extractMonth().as("field1").and(DB_FIELD_2).extractMonth().as("field2"); 
+0

什麼是project()在第一行? – user3528213

+0

對不起,這是創建'$ project'階段。使用'Aggregation.project()'。更新了答案。 – Veeram

+0

以及DateOperators。我無法找到該類 – user3528213