用例非常简单,但是并没有意识到找到解决方案将变得如此具有挑战性。
用例
驾驶员需要在相同的取放位置(+/-几百米)内取放所有包裹。
要求
Mongo查询,该查询针对给定的取件位置(lng,lat)和下车位置(lng,lat),给出位于相同取件位置和下车位置几百米以内的所有包裹。
当前设置
使用spring-boot 2.1.5和MongoDB 4.0 +
MongoDB集合:“程序包”
Document definition: packageId: ObjectId("5312xx"), fromLocation: {type:"Point",coordinates:[-122, 37]}], toLocation: {type:"Point",coordinates:[-121, 36]}], additionalFields: Object
Java类
@Document(collection="packages") public class Package { @Id private String id; private GeoJsonPoint fromLocation; private GeoJsonPoint toLocation; }
尝试
MongoDB支持地理空间查询,它允许您在fromLocation和toLocation上创建2dsphere索引。但是,然后我无法运行$ 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();
当我仅在fromLocation上定义一个 2dshpere 索引时,此方法有效,但随后只满足用例的一半。我仍然需要找出匹配相同的近似toLocation的软件包。
问: 我该如何设置或查询MongoDB,以便它可以返回所有匹配的文档(包)。相同的取货和送货地点?
希望很明显,或者我可以再尝试做一次更好的解释。