使用Spring Data在$ project MongoDB中进行$ filter

问题描述 投票:1回答:2

我有一个子文档,它是父文档的数组。 “设备”

在那个数组中,我有一个属性是Date属性。

我想通过确定的日期找到包含子子文档的父文档,如下所示:

{
"_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

谢谢。

java spring mongodb spring-data spring-mongo
2个回答
8
投票

我设法用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 boot 1.4.0.RELEASE上,但是那个版本没有AggregationExpression接口PUBLIC,所以我刚刚更新到1.4.1.RELEASE并且我确实工作了。


1
投票

这就是它在spring-data-mongodb-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")
        );
© www.soinside.com 2019 - 2024. All rights reserved.