Mangodb实现附近功能

文章展示了如何在JavaBean中使用注解定义MongoDB的地理索引,以及如何进行附近地点和距离查询。在遇到索引未创建的问题时,可以通过手动添加索引来解决。
摘要由CSDN通过智能技术生成

javaBean

@Data
@NoArgsConstructor
@AllArgsConstructor
@Document("places")
@CompoundIndex(name = "location_index",def = "{'location':'2dsphere'}")
public class Places {
    // 唯一id
    private ObjectId id;
    // 地理标题
    private String title;
    // 地理描述
    private String address;
    // 地理信息类(存储经纬度)
    private GeoJsonPoint location;
}

使用@CompoundIndex添加符合索引要修改配置类才会生效

#该配置在第一次生成表的时候生效,如果表已存在,需要删除表重新生成

spring:
  data:
    mongodb:
      auto-index-creation: true #自动创建索引

百度自动拾取坐标:拾取坐标系统 

 添加数据

public void testSave(){
    Places places = new Places();
    places.setId(ObjectId.get());
    places.setTitle("南湖公园");
    places.setAddress("江苏省宿迁市沭阳县南湖路");
    places.setLocation(new GeoJsonPoint(118.763185,34.099015));
    mongoTemplate.save(places);

    Places places1 = new Places();
    places1.setId(ObjectId.get());
    places1.setAddress("江苏省宿迁市沭阳县承辉路碧桂园南城首府");
    places1.setTitle("碧桂园");
    places1.setLocation(new GeoJsonPoint(118.761665,34.072623));
    mongoTemplate.save(places1);
}

测试查询附近

public void testNear(){
    // 查询附近

    //1 准备数据
    //1.1 构建中心坐标
    GeoJsonPoint point = new GeoJsonPoint(118.763185,34.100015);
    //1.2 查询半径1千米
    Distance distance = new Distance(1, Metrics.KILOMETERS);
    //1.3 绘制圆
    Circle circle = new Circle(point, distance);

    //2 查询
    Query query = Query.query(Criteria.where("location").withinSphere(circle));
    //2.1 查询条件
    List<Places> list = mongoTemplate.find(query, Places.class);
    //2.2 查询结果
    list.forEach(System.out::println);
    //结果:Places(id=6459a4061507b7408ffbfbb9, title=南湖公园, address=江苏省宿迁市沭阳县南湖路, location=Point [x=118.763185, y=34.099015])
}

测试查询距离

public void testDistance(){
    //1 构建中心点
    GeoJsonPoint point = new GeoJsonPoint(118.763185,34.100015);
    //2 构建附近查询对象 1千米
    NearQuery nearQuery = NearQuery.near(point, Metrics.KILOMETERS).maxDistance(1, Metrics.KILOMETERS);
    //3 查询附近
    GeoResults<Places> results = mongoTemplate.geoNear(nearQuery, Places.class);
    //4 获得距离和数据
    for (GeoResult<Places> result : results) {
        Places places = result.getContent();
        double value = result.getDistance().getValue();
        System.out.println(places + " -- 距离:" + value + "km");
    }
    //结果:Places(id=6459a4061507b7408ffbfbb9, title=南湖公园, address=江苏省宿迁市沭阳县南湖路, location=Point [x=118.763185, y=34.099015]) -- 距离:0.11131884502147556km
}

可能的报错:Command failed with error 27 (IndexNotFound) 找不到索引字段 

即索引无数据

解决办法:手动添加索引

db.places.createIndex({'location':'2dsphere'})

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值