0

我要做什么:我们有一个数据库,该数据库存储运输车辆的 GPS 位置,该位置存储间隔 5 分钟内的数据。我想从特定的黄金地段获取半径内所有车辆的数据。我们使用的数据库是 MongoDB,因为它提供了可以解决我的目的的 geoNear 查询。

我应用 geoNear 查询通过 JAVA 从给定点的特定半径内从 MongoDB 获取该数据,但是当我对 geoNear 查询接收到的数据运行循环时,循环它需要 20 多秒。这是我想要做的,

private AggregateIterable<Document> getNearbyGpsData(Double lat, Double lon, List<Integer> vehicleIds, boolean spherical) {
    MongoCollection<Document> collection = mongoService.getDocumentMongoCollection("vehicle");
    
    AggregateIterable<Document> travelledVehiclesData = collection.aggregate(getBsonFilters(lat, lon, vehicleIds, spherical));
    
    return travelledVehiclesData;
}

private List<Bson> getBsonFilters(Double lat, Double lon, List<Integer> vehicleIds, boolean spherical) {
    List<Bson> filters = new ArrayList<>();
    
    Bson geoNearFilter = eq("$geoNear", and(eq("near", and(eq("type", "Point"),
                eq("coordinates", Arrays.asList(lon, lat)))),
                eq("distanceField", "distance"),
                eq("maxDistance", 100),
                eq("spherical", true),
                eq("$limit", 10000L)));
    filters.add(geoNearFilter);
    
    return filters;
}

我还尝试使用 $geoWithin 查询($geoWithin 现在已替换为 $within)

Bson geoWithinFilter =
                    eq("loc",
                    and(eq("within",
                            and(eq("$center", Arrays.asList(Arrays.asList(lon, lat), 10000L))))));
    filters.add(geoWithinFilter);

但是出现了一个错误:无法识别的管道阶段名称:'loc',我无法弄清楚。

请建议如何解决它。或者如何以更好的方式做到这一点。

4

0 回答 0