Агрегатная функция Spring data mongodb не работает с использованием 1.3.5-RELEASE из spring-data-mongodb

У меня есть требование отфильтровать документ в mongodb с использованием данных Spring, которые содержат объединенные массивы массивов. Я использую следующий запрос агрегации в оболочке mongo, и он работает нормально. Но когда я запускаю это с помощью операции агрегации springdata, я получаю пустой ответ. Рабочий запрос mongo:

db.searchResource.aggregate({$match:{"_id" : ObjectId("53cf4e3dae92ac6561807f6d")}},{$project:{"rssSearchResponse.journeys":1}},{$unwind : "$rssSearchResponse.journeys"},{$match:{"rssSearchResponse.journeys.stops":0}});

Код данных Spring, который я использую и не работает:

TypedAggregation<SearchResource> aggregation = Aggregation.newAggregation(SearchResource.class, Aggregation.match(new Criteria("_id").is(new ObjectId(searchId))),
                Aggregation.project("rssSearchResponse.journeys"),
                Aggregation.unwind("rssSearchResponse.journeys"),
                Aggregation.match(new Criteria("rssSearchResponse.journeys.stops").is(0))
                );
AggregationResults<SearchResource> result = mongoOperations.aggregate(aggregation, JourneyInformation.class);

Я попытался сломать эту агрегатную функцию, и она может проецировать rssSearchResponse.journeys, но после $ unwind возвращает пустой результат.

Любая помощь высоко ценится.


person Developer G    schedule 07.08.2014    source источник
comment
Вы пробовали последнюю версию 1.4.2.RELEASE?   -  person Oliver Drotbohm    schedule 07.08.2014
comment
Спасибо, Оливер, все заработало, обновив версию до 1.4.x.   -  person Developer G    schedule 08.08.2014


Ответы (2)


Как насчет:

@Test
public void foo() {

    mongoTemplate.dropCollection(RssSearchResponse.class);

    RssSearch rs = new RssSearch();
    rs.id  = "123";
    rs.rssSearchResponse = new RssSearchResponse(
            new Journey[] {new Journey("A", 1),new Journey("B", 0),new Journey("C", 0),new Journey("D", 1)}
    );

    mongoTemplate.insert(rs);

    Aggregation agg = newAggregation(RssSearch.class, //
          match(where("_id").is(rs.id)) //
        , project("rssSearchResponse.journeys") //
        , unwind("journeys") //
        , match(where("journeys.stops").is(0)) //
    );

    AggregationResults<DBObject> result = mongoTemplate.aggregate(agg, RssSearch.class, DBObject.class);
    System.out.println(result);

}

static class RssSearch{
    String id;
    RssSearchResponse rssSearchResponse;
}

static class RssSearchResponse{
    Journey[] journeys;

    public RssSearchResponse(Journey[] journeys) {
        this.journeys = journeys;
    }
}

static class Journey{
    String name;
    int stops;

    public Journey(String name, int stops) {
        this.name = name;
        this.stops = stops;
    }
}

Это вернет B и C.

Мы генерируем следующую команду агрегации:

{ 
    "aggregate" : "rssSearch" 
  , "pipeline" : [ 
     { "$match" : { "_id" : "123"}} 
   , { "$project" : { "journeys" : "$rssSearchResponse.journeys"}}
   , { "$unwind" : "$journeys"}
   , { "$match" : { "journeys.stops" : 0}}
  ]
}
person Thomas Darimont    schedule 07.08.2014
comment
Спасибо, Томас за ваш ответ, я пробовал то же самое, что вы упомянули выше, но он не работал при раскручивании, но когда я обновился до версии Spring data mongodb 1.4.x, это сработало для меня. - person Developer G; 08.08.2014

 match(where("_id").is(rs.id)) 

Не работает в Mongo Aggregation.

Вам нужно преобразовать rs.id в ObjectId

match(where("_id").is(new ObjectId(rs.id))) 
person Mehraj Malik    schedule 28.11.2017