如何在MongoDB中设计和编写地理空间查询以查找具有相同开始和结束位置的文档?

时间:2019-05-29 00:43:18

标签: spring-boot mongodb-geospatial

用例非常简单,但是并没有意识到找到解决方案将变得如此具有挑战性。

用例

驾驶员需要在相同的取放位置(+/-几百米)内取放所有包裹。

要求

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,以便它可以返回所有匹配的文档(包)。相同的取货和送货地点?

希望很明显,或者我可以再尝试做一次更好的解释。

0 个答案:

没有答案