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

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

Случай использования

Водитель должен забрать и доставить все посылки, которые находятся в одном и том же месте посадки и высадки (+/- несколько сотен метров).

требование

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

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

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

Коллекция MongoDB:"пакеты"

    Определение документа:
        packageId: ObjectId("5312xx"),
        fromLocation: {тип:"Точка", координаты:[-122, 37]}],
        toLocation: {тип:"Точка", координаты:[-121, 36]}],
        extraFields: Object 

Класс Java

    @Document(сбор ="пакеты")
    открытый класс Package {    
        @Я бы
        частный идентификатор строки;
        частный GeoJsonPoint от местоположения;
        частный GeoJsonPoint toLocation;
    }

попытки

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

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

    Point reqPoint = новая точка (-121.xx,37.33xx); // выбрать место
    NearQuery nq = NearQuery.near(reqPoint, Metrics.MILES).maxDistance(.2);

    TypedAggregation agg = Aggregation.newAggregation(Package.class,
                    Aggregation.geoNear(nq, "расстояние"),
                    Aggregation.project(Package.getFields())
                    .andExpression(someExpressions..),
                    Aggregation.match(Criteria.where("поле!"). GTE (значение)));
    AggregationResults aggResults = mongoTemplate.aggregate(agg, Package.class, Package.class);
    Список результатов = aggResults.getMappedResults();

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

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

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

0 ответов

Другие вопросы по тегам