Как спроектировать и написать геопространственный запрос в 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, чтобы он мог возвращать все соответствующие документы (пакеты), которые имеют прибл. одни и те же места получения и доставки?
Надеюсь, это понятно, или я могу предпринять еще одну попытку объяснить лучше.