Наконец, я смог выполнить вышеупомянутое требование, используя саму реализацию монго.Там могут быть лучшие решения с использованием последних версий МонгоЯ использую spring-data-mongodb-1.8.2.RELEASE, так что это может помочь любому, кто ищет подобное решение.
Создать класс для поддержки операции агрегирования:
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
import org.springframework.data.mongodb.core.aggregation.AggregationOperationContext;
import com.mongodb.DBObject;
public class CustomProjectAggregationOperation implements AggregationOperation {
private DBObject operation;
public CustomProjectAggregationOperation (DBObject operation) {
this.operation = operation;
}
@Override
public DBObject toDBObject(AggregationOperationContext context) {
return context.getMappedObject(operation);
}
}
Реализация:
Criteria criteria = new Criteria();
criteria = criteria.and("date").gte(fromDate).lte(endDate).exists(true);
DBObject operation = (DBObject)new BasicDBObject("$group",
new BasicDBObject("_id", new BasicDBObject("month",
new BasicDBObject("$month", "$date")))
.append("passCount", new BasicDBObject("$sum",
new BasicDBObject("$cond", new Object[]{
new BasicDBObject("$eq", new Object[]{ "$status",
"Pass"}),1,0}))
).append("failCount", new BasicDBObject(
"$sum", new BasicDBObject("$cond", new Object[]{
new BasicDBObject("$eq", new Object[]{ "$status",
"Fail"}),1,0}))
));
Aggregation agg = newAggregation(match(criteria),new
CustomProjectAggregationOperation(operation));
List<ModelClass> modelList= mongoTemplate.aggregate(agg,"collectionName",ModelClass.class).getMappedResults();
Модель класса Ссылка для любых новичков монго, как я:
public class ModelClass{
private String month;
private int passCount;
private int failCount;
public String getMonth() {
return month;
}
public void setMonth(String month) {
this.month= month;
}
public int getPassCount() {
return passCount;
}
public void setPassCount(int passCount) {
this.passCount= passCount;
}
public int getFailCount() {
return failCount;
}
public void setFailCount(int failCount) {
this.failCount = failCount;
}
}
Пожалуйста, не забудьте создатьМодель pojo с похожими именами, указанными в запросе для отображения монго на работу.
Эквивалент Mongo Shell:
db.collectionName.aggregate([
{
"$match": {
"date": {
"$gte": {
"$date": "2018-12-31T18:30:00.000Z"
},
"$lte": {
"$date": "2019-12-31T13:43:17.106Z"
},
"$exists": true
}
}
}, {
"$group": {
"_id": {
"month": {
"$month": "$date"
}
},
"passCount": {
"$sum": {
"$cond": [{
"$eq": ["$status", "Pass"]
}, 1, 0]
}
},
"failCount": {
"$sum": {
"$cond": [{
"$eq": ["$status", "Fail"]
}, 1, 0]
}
}
}
}
]);