使用Spring Data在$ project MongoDB中的$ filter [英] $filter inside $project MongoDB Using Spring Data
问题描述
我有一个子文档,它是父文档的数组. 设备"
I have a subdocument that is an array of a parent document. "devices"
在该数组中,我有一个属性,它是一个Date属性.
In that array I've got a property which is a Date property.
我想按确定日期查找包含子文档的父文档,如下所示:
I want to find the parents documents who contains the child subdocuments by determinated date like this:
{
"_id" : ObjectId("5818fa596969a1339093a7da"),
"fecha" : ISODate("2016-11-01T05:00:00.000Z"),
"spot" : "5808e3926969a126c8365c94",
"devices" : [
{
"evaluationDate" : ISODate("2016-11-01T20:26:00.000Z"),
"seenTimesCounter" : 0,
"category" : "PRE_PASAJERO",
"status" : "NO_CONECTADO"
},
{
"evaluationDate" : ISODate("2016-11-01T20:26:00.000Z"),
"seenTimesCounter" : 0,
"category" : "PRE_PASAJERO",
"status" : "NO_CONECTADO"
},
{
"evaluationDate" : ISODate("2016-11-01T20:26:00.000Z"),
"seenTimesCounter" : 0,
"category" : "PRE_PASAJERO",
"status" : "NO_CONECTADO"
},
{
"evaluationDate" : ISODate("2016-11-01T20:26:00.000Z"),
"seenTimesCounter" : 0,
"category" : "PRE_PASAJERO",
"status" : "NO_CONECTADO"
},
{
"evaluationDate" : ISODate("2016-11-01T20:26:00.000Z"),
"seenTimesCounter" : 0,
"category" : "PRE_PASAJERO",
"status" : "NO_CONECTADO"
},
{
"evaluationDate" : ISODate("2016-11-01T20:26:00.000Z"),
"seenTimesCounter" : 0,
"category" : "PRE_PASAJERO",
"status" : "NO_CONECTADO"
}
]
}
我已经在mongo shell上尝试了此操作(并且查询很好,它返回了我想要的内容):
db.getCollection('spotMovimientos').aggregate([
{$match:{'devices.evaluationDate':ISODate("2016-11-01T20:26:00.000Z")}},
{$project: {
'devices':{$filter:{
input:'$devices',
as:'device',
cond: {$eq: ['$$device.evaluationDate', ISODate("2016-11-01T20:26:00.000Z")]}
}
} }
}
])
有人可以详细说明吗?我需要帮助将其转换为 SPRING DATA
Can anyone elaborate on this? I need help to convert this to SPRING DATA
谢谢.
推荐答案
我设法解决了Spring boot版本1.4.1RELEASE的问题,我做到了:
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);
我根据以下内容进行了详细说明: Spring Data MongoDb是否支持$ filter数组聚合运算符?
I elaborated based on this: Does Spring Data MongoDb support $filter array aggregations operator?
我的项目是在Spring Boot 1.4.0.RELEASE上进行的,但是该版本没有 AggregationExpression 接口PUBLIC,所以我刚刚更新到1.4.1.RELEASE,并且确实可以工作.
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.
这篇关于使用Spring Data在$ project MongoDB中的$ filter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!