我要做什么:我们有一个数据库,该数据库存储运输车辆的 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',我无法弄清楚。
请建议如何解决它。或者如何以更好的方式做到这一点。