实体类

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.geo.GeoJsonPoint;
import org.springframework.data.mongodb.core.index.CompoundIndex;
import org.springframework.data.mongodb.core.index.Indexed;
import org.springframework.data.mongodb.core.mapping.Document;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Document(collection = "User_Location")
//联合索引,可以加速搜索
@CompoundIndex(name = "location_index", def = "{'location': '2dsphere'}")
public class UserLocation implements java.io.Serializable {

    private static final long serialVersionUID = 4508868382007529970L;

    @Id
    private ObjectId id;
    @Indexed
    private Long userId; //用户id
    private GeoJsonPoint location; //x:经度 y:纬度
    private String address; //位置描述
    private Long create_time; //创建时间
    private Long update_time; //更新时间
    private Long lastUpdated; //上次更新时间
}

实体类VO

@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserLocationVo implements Serializable {
    private static final long serialVersionUID = 4133419501260037769L;
    private String id;
    private Long userId; //用户id
    private Double longitude;   //经度
    private Double latitude; //维度
    private String address; //位置描述
    private Long create_time; //创建时间
    private Long update_time; //更新时间
    private Long lastUpdated; //上次更新时间

    // MongoDB的GeoJsonPoint 不能直接被序列化!所以需要我们使用vo收发数据
    public static final UserLocationVo format(UserLocation userLocation) {
        UserLocationVo userLocationVo = new UserLocationVo();
        userLocationVo.setAddress(userLocation.getAddress());
        userLocationVo.setCreate_time(userLocation.getCreate_time());
        userLocationVo.setId(userLocation.getId().toHexString());
        userLocationVo.setLastUpdated(userLocation.getLastUpdated());
        userLocationVo.setUpdate_time(userLocation.getUpdate_time());
        userLocationVo.setUserId(userLocation.getUserId());
        userLocationVo.setLongitude(userLocation.getLocation().getX());
        userLocationVo.setLatitude(userLocation.getLocation().getY());
        return userLocationVo;
    }

    public static final List<UserLocationVo> formatToList(List<UserLocation> userLocations) {
        List<UserLocationVo> list = new ArrayList<>();
        for (UserLocation userLocation : userLocations) {
            list.add(format(userLocation));
        }
        return list;
    }
}

伪添加用户地理位置代码

        try {
            // 查询有没有这个人的地理位置记录
            Query query = new Query();
            query.limit(1);
            query.addCriteria(Criteria.where("userId").is("你自己传入的账号"));
            UserLocation user_location = mongoTemplate.findOne(query, UserLocation.class, "User_Location");
            Update update = new Update();
            // 设置经纬度
中⼼点 下面经纬度由前端传参
            GeoJsonPoint geoJsonPoint = new GeoJsonPoint(longitude, latitude);
            update.set("location", geoJsonPoint);
            // 判断有没有这个用户的地理位置记录,如果没有地理位置记录,就追加创建、更新、上次更新时间,否则更新、上次更新时间
            long currentTimeMillis = System.currentTimeMillis();
            if (user_location != null) {
                update.set("update_time", currentTimeMillis);
                update.set("lastUpdated", user_location.getUpdate_time());
            } else {
                update.set("create_time", currentTimeMillis);
                update.set("update_time", currentTimeMillis);
                update.set("lastUpdated", currentTimeMillis);
            }
            long modifiedCount = mongoTemplate.upsert(query, update, "User_Location").getModifiedCount();
            log.info("受到影响的结果有:{}条", modifiedCount);
        } catch (Exception e) {
            log.error("数据库操作异常" + e);
            return Results.error("数据库操作异常");
        }

查询附近用户

        List<UserLocationVo> userLocationVos = null;
        try {
            // 设置地理位置中⼼点
            GeoJsonPoint geoJsonPoint = new GeoJsonPoint(longitude, latitude);
            // 转换为2dsphere的 距离 range单位是千米
            Distance distance = new Distance(range / 1000, Metrics.KILOMETERS);
            //画⼀个圆
            Circle circle = new Circle(geoJsonPoint, distance);
            Query query = new Query();
            query.addCriteria(Criteria.where("location").withinSphere(circle));
            userLocationVos = UserLocationVo.formatToList(this.mongoTemplate.find(query, UserLocation.class, "User_Location"));
        } catch (Exception e) {
            log.error("数据库操作异常" + e);
            return Results.error("数据库操作异常");
        }
特殊说明:
上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取全部资料 ❤