Geonear Spring-MongoDB не работает с дополнительными полями

У меня есть некоторые геопространственные данные в MongoDB, и я хочу найти список мест, которые находятся рядом с местоположением пользователя и соответствуют определенным критериям.

Вот структура моего документа:

{ "_id" : { "$oid" : "528af043d1a2760efcd2fd2f" }, "city" : "Miami", "name" : "Some Place", "tickets" : 61, "zipcode" : "33142", "type" : "amusement park", "state" : "FL", "location" : [ -80.24, 25.8092 ]}
{ "_id" : { "$oid" : "528af043d1a2760efcd2fd30" }, "city" : "Miami", "name" : "Other place", "tickets" : 15, "zipcode" : "33150", "type" : "theatre", "state" : "FL", "location" : [ -80.2094, 25.8587 ]}

Теперь я пытаюсь найти места по широте, долготе, в которых есть билеты и они определенного типа. Когда я просто использую NearQuery с координатами (без добавления запроса), я получаю результаты, но когда я добавляю объект запроса, я получаю пустой список.

Вот мой код:

public GeoResults<Place> find(double lat, double lon, int tickets, String type) {
    Point point = new Point(lon, lat);

    Query query = new Query(Criteria.where("tickets").gt(tickets).
            and("type").is(type));
    NearQuery nearQuery = NearQuery.near(point).maxDistance(new Distance(10, Metrics.KILOMETERS));
    nearQuery.query(query);
    GeoResults<Place> repoData = repo.findByLocationNear(point, new Distance(10, Metrics.KILOMETERS));

    GeoResults<Place> data = mongoTemplate.geoNear(nearQuery, Place.class);         
    List<Place> testData = mongoTemplate.find(query, Place.class);

    return data;
}

Из приведенного выше кода данные GeoResults не имеют содержимого, в то время как List testData возвращает правильные результаты (но не использует пространственную информацию). Если я использую репозиторий, я могу получить список мест, но это не учитывает дополнительные параметры.

Заранее спасибо


person Yogesh    schedule 19.11.2013    source источник


Ответы (2)


Я нашел один способ сделать это сам. Я полностью отладил код в библиотеке Spring-mongodb и увидел, что для «num» установлено значение 0, а для «fields» установлено значение null. Поэтому во время отладки я добавил поля вручную и указал количество документов, которые он должен получить. Я предполагал, что он должен возвращать все поля и любое количество документов, соответствующих критериям.

Вот обновленный код для создания запроса:

Query query = new Query(Criteria.where("tickets").gt(tickets).
            and("type").is(type));
query.fields().include("city").include("name").include("tickets").
include("type").include("state").include("address");

NearQuery nearQuery = NearQuery.near(point).maxDistance(new Distance(radius, Metrics.KILOMETERS));
nearQuery.query(query);
nearQuery.num(100);

GeoResults<Place> data = mongoTemplate.geoNear(nearQuery, Place.class); 
person Yogesh    schedule 20.11.2013

У меня была такая же проблема, и после долгой борьбы я наконец нашел основную причину своей проблемы.

1. NearQuery.near(point).maxDistance(distance); //returns all possible results
2. NearQuery.near(point).maxDistance(distance).num(20); //returns 20 nearest results   
3. NearQuery.near(point).maxDistance(distance).num(20).query(new Query()); //returns 0!! results
4. NearQuery.near(point).maxDistance(distance).query(new Query()).num(20); //returns 20 nearest results
5. NearQuery.near(point).maxDistance(distance).query(new Query().limit(20)); //returns 20 nearest results
6. NearQuery.near(point).maxDistance(distance).query(new Query().limit(20)).num(5); //returns 5!! nearest results

Причина, по которой третий NearQuery имеет 0 результатов, связана с тем, что .query(...) часть класса NearQuery делает это:

public NearQuery query(Query query) {
    this.query = query;
    this.skip = query.getSkip();
    this.num = query.getLimit();
    return this;
}

Параметр num из NearQuery переопределяется параметром limit из Query. Порядок .num(...) и .query(...) действительно важен. Вы должны добавить .num(20) после .query(...) лайка (4) или использовать query.limit(20) лайка (5). Если вы комбинируете оба, последнее значение выигрывает (6).

person valmor    schedule 18.12.2013