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