如何在Criteria中使用mongodb聚合函数?

时间:2017-05-10 17:52:25

标签: spring-data-mongodb spring-mongo spring-mongodb

我正在开发一个使用spring数据mongodb的项目。我正在制作像这样的mongo查询:

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”类中包含聚合函数。我的最终结果应该是这样的:

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

1 个答案:

答案 0 :(得分: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");