如何获得距离 - MongoDB模板近功能

时间:2015-09-26 10:07:54

标签: spring mongodb spring-boot spring-data-mongodb spring-mongodb

我正试图找到附近的地方。 下面的代码工作正常。 但是我无法从我给定的纬度获得实际的距离,lng。

Criteria criteria = new Criteria("coordinates")
    .near(new Point(searchRequest.getLat(),searchRequest.getLng()));

Query query = new Query();
query.addCriteria(criteria);
query.addCriteria(criteriaName);
query.limit(5);
List<Place> ls = (List<Place>) mongoTemplate.find(query, Place.class);

2 个答案:

答案 0 :(得分:2)

您可以使用geoNear aggregation执行此操作。在spring-data-mongodb GeoNearOperation代表了这种聚合。

使用您希望获得距离信息的字段(具有继承的示例)扩展或创建继承Place类:

public class PlaceWithDistance extends Place {
    private double distance;

    public double getDistance() {
        return distance;
    }

    public void setDistance(final double distance) {
        this.distance = distance;
    }
}

而不是CriteriaQuery使用聚合。 geoNear的第二个参数是应设置距离的字段名称:

final NearQuery nearQuery = NearQuery
    .near(new Point(searchRequest.getLat(), searchRequest.getLng()));
nearQuery.num(5);
nearQuery.spherical(true); // if using 2dsphere index, otherwise delete or set false

// "distance" argument is name of field for distance
final Aggregation a = newAggregation(geoNear(nearQuery, "distance"));

final AggregationResults<PlaceWithDistance> results = 
    mongoTemplate.aggregate(a, Place.class, PlaceWithDistance.class);

// results.forEach(System.out::println);
List<PlaceWithDistance> ls = results.getMappedResults();

只是为了简化相关的导入:

import static org.springframework.data.mongodb.core.aggregation.Aggregation.geoNear;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.newAggregation;

import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.aggregation.GeoNearOperation;
import org.springframework.data.mongodb.core.query.NearQuery;

答案 1 :(得分:1)

Walery Strauch的例子对我有用......

但是我想:

  • 运行聚合查询以获得2dsphere索引中的所有点,其中给定距离以公里或米为单位。您可以使用Metrics.KILOMETERS&amp; Metrics.MILES
  • 集合名称未指定为pojo
  • 的一部分

我在MongoDB中有旧的表示方式的2dsphere索引。我使用Mongo作为Geo-Spatial查询的分片数据库。只有在我有2dsphere索引的同一个集合中添加了一个分片键时,我的nearSphere查询(没有聚合)才会失败。

在同一集合中使用带有分片键的以下实现之后。我成功地获取了所需的数据。

以下是样本:

`item_id` | `item`
----------+-------
    1     |   A   
    2     |   B