복붙노트

[SPRING] $ project 내부의 $ filter MongoDB 스프링 데이터 사용하기

SPRING

$ project 내부의 $ filter MongoDB 스프링 데이터 사용하기

상위 문서의 배열 인 하위 문서가 있습니다. '기기'

그 배열에서 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")]}
    }
} }
}
])

아무도 이것에 정성 들일 수 있습니까? 이것을 스프링 데이터로 변환하는 데 도움이 필요합니다.

고맙습니다.

해결법

  1. ==============================

    1.나는 스프링 부트 버전 1.4.1.RELEASE로 내 문제를 해결할 수 있었다. 나는 이것을했다.

    나는 스프링 부트 버전 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);
    

    나는 이것에 기초하여 정교하게 만들었다. Spring Data MongoDb는 $ filter 배열 집계 연산자를 지원합니까?

    내 프로젝트는 스프링 부트 1.4.0.RELEASE에 있었지만 그 버전에는 AggregationExpression 인터페이스 PUBLIC이 없었기 때문에 1.4.1.RELEASE로 업데이트되었고 제대로 작동했습니다.

  2. ==============================

    2.그리고 이것은 스프링 - 데이터 -mongodb-2.0.10 (스프링 부트 2)

    그리고 이것은 스프링 - 데이터 -mongodb-2.0.10 (스프링 부트 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")
            );
    
  3. from https://stackoverflow.com/questions/40391987/filter-inside-project-mongodb-using-spring-data by cc-by-sa and MIT license