Как спроектировать и написать геопространственный запрос в MongoDB, чтобы найти документы с одинаковыми начальными и конечными местоположениями? - PullRequest
0 голосов
/ 29 мая 2019

Вариант использования очень прост, но он не понимал, что будет сложно найти решение.

Вариант использования

Драйвер должен получитьи доставить все посылки, которые находятся в одном и том же пункте приема и выдачи (+/- несколько сотен метров).

Требование

Запрос Монго, который для заданного места получения (lng, lat) и места выгрузки (lng, lat) дает все пакетыкоторые находятся в пределах 100 метров от того же места посадки и высадки.

Текущая настройка

Использование spring-boot 2.1.5 и MongoDB 4.0 +

Коллекция MongoDB: 'packages'


    Document definition:
        packageId: ObjectId("5312xx"),
        fromLocation: {type:"Point",coordinates:[-122, 37]}],
        toLocation: {type:"Point",coordinates:[-121, 36]}],
        additionalFields: Object 

Java Class


    @Document(collection="packages")
    public class Package {    
        @Id
        private String id;
        private GeoJsonPoint fromLocation;
        private GeoJsonPoint toLocation;
    }

Попытки

MongoDB поддерживает геопространственные запросы, он позволяет создавать индексы 2dsphere как из fromLocation, так и toLocation.Но тогда я не могу выполнить запрос $ near, так как он жалуется на то, какой индекс выбрать.

Лучшее, что я могу получить, это:


    Point reqPoint = new Point(-121.xx,37.33xx); // pickup location
    NearQuery nq = NearQuery.near(reqPoint, Metrics.MILES).maxDistance(.2);

    TypedAggregation agg = Aggregation.newAggregation(Package.class,
                    Aggregation.geoNear(nq, "distance"),
                    Aggregation.project(Package.getFields())
                    .andExpression(someExpressions..),
                    Aggregation.match(Criteria.where("field!").gte(val))
                    );
    AggregationResults aggResults = mongoTemplate.aggregate(agg, Package.class, Package.class);
    List results = aggResults.getMappedResults();

Это работает, когда у меня есть толькоодин индекс 2dshpere , определенный для fromLocation, но тогда он служит только половине варианта использования.Мне все еще нужно выяснить пакеты, совпадающие примерно с местоположением.

Q: Как настроить или запросить MongoDB, чтобы он мог возвращать все соответствующие документы (пакеты), которые имеют прибл.одни и те же места получения и доставки?

Надеюсь, это понятно, или я могу предпринять еще одну попытку объяснить лучше.

...