I have a subdocument that is an array of a parent document. \"devices\"
In that array I\'ve got a property which is a Date property.
I want
And this is how it's made in spring-data-monogodb-2.0.10 (Spring Boot 2)
Aggregation aggregation = newAggregation(
match(Criteria.where("devices.evaluationDate").is(date)),
project().and(new AggregationExpression() {
@Override
public Document toDocument(AggregationOperationContext aggregationOperationContext) {
Document filterExpression = new Document();
filterExpression.put("input", "$devices");
filterExpression.put("as", "device");
filterExpression.put("cond", new Document("$eq", Arrays.<Object> asList("$$device.evaluationDate", date)));
return new Document("$filter", filterExpression);
}
}).as("devices")
);
I managed to solve my problem with the Spring boot Version 1.4.1.RELEASE and I did this:
Aggregation aggregation = newAggregation(
match(Criteria.where("devices.evaluationDate").is(date)),
project().and(new AggregationExpression() {
@Override
public DBObject toDbObject(AggregationOperationContext aggregationOperationContext) {
DBObject filterExpression = new BasicDBObject();
filterExpression.put("input", "$devices");
filterExpression.put("as", "device");
filterExpression.put("cond", new BasicDBObject("$eq", Arrays.<Object> asList("$$device.evaluationDate", date)));
return new BasicDBObject("$filter", filterExpression);
}
}).as("devices")
);
AggregationResults<SpotMovimientos> list = mongoOperations.aggregate(aggregation,
MyClass.class, MyClass.class);
I elaborated based on this: Does Spring Data MongoDb support $filter array aggregations operator?
My project was on Spring boot 1.4.0.RELEASE but that version didnt have the AggregationExpression interface PUBLIC, so i just updated to 1.4.1.RELEASE and i did work.