我有一个子文档,它是父文档的数组。“设备”
在这个数组中,我有一个属性,它是一个日期属性。
我想按确定的日期查找包含子文档的父母文档,如下所示:
{
"_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上尝试过了(查询很好,它返回我想要的):
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
谢谢。
发布于 2016-11-03 16:55:23
我设法解决了Spring引导版本1.4.1.RELEASE的问题,并完成了以下操作:
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);
我在此基础上进行了详细阐述:Does Spring Data MongoDb support $filter array aggregations operator?
我的项目是Spring 1.4.0.RELEASE,但是那个版本没有AggregationExpression接口公共,所以我只是更新到1.4.1.RELEASE,我做了工作。
发布于 2019-03-12 08:46:40
这是在spring-data-monogodb-2.0.10 (Spring 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")
);
https://stackoverflow.com/questions/40391987
复制相似问题