开发者学堂课程【Java Spring Boot 2.6.0开发实战-1024程序员节创造营公益课:使用 MongoDB 搜索附近的人】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/903/detail/14341
使用 MongoDB 搜索附近的人
目录:
一, MongoDB 在生活中的应用
二, LBS 搜索附近的 X-解决方案
三, LBS 搜索附近的 X-Redis 支持
四, LBS 搜索附近的人-MongoDB 支持
五, LBS 搜索附近的人—MongoDB 支持 GEO 索引
六, 搜索附近的 X—SpringBoot+MongoDB 解决方案
七, MongoDB 简介
八, Repository 仓储层代码
九, Spring Data 2.6 MongoDB 新特性
十, 代码实操演示
前言:MongoDB 在生活中的应用
MongoDB 可以直接用于存储当前用户或者测量的经纬度。
生活中的实例:
如美团,高德地图,滴滴打车,哈喽单车,饿了么等等。
一, LBS 搜索附近的 X-解决方案
应用技术:
1.LBS 基 1B
2.MongoDB
3. Redis
4.Elastic Search
5. MySQL: SPATIAL INDEX
6. Postgresql PostGis 索引
GEO 算法实例:
1. Geohash,地图分割不同区域,二维坐标生成一个
字符串
二,LBS 搜索附近的 X-Redis 支持
1. Redis 3.2提供了基于 GeoHash 和数据结构 Zset 地理位置功能
2.GEOADD:新增位置(纬度、经度、名字)添加到指定的 key;
3. GEOPOS:从 key 里面返回对象的位置(经度和纬度);
4.GEODIST:返回两个给定位置之间的距离;
5. GEOHASH:返回一个或多个位置对象的 Geohash 表示;
6. GEORADIUS:以给定经纬度为中心,半径内所有位置对象;
7.GEORADIUSBYMEMBER:以给定的对象为中心,半径内所有位
置对象。
8. Redis 6.2版本为 Geo 新增了 GEOSEARCH 和 GEOSEARCHSTORE 指令,阿里云矩形区域查询
三,LBS 搜索附近的人-MongoDB 支持
1.MonaoDB 主要两种地理空间索引 2dsphere 和 2d。
2.两种索引的底层依然是基千 Geohash 来讲行松建的
3.值与国际通用的 Geohash 还有一些不同,具体参考
官方文档。
4.2dsphere 索引仅支持球形表面的几何形状查询。
5. 2d 素引支持平首几石形状和二些球形誉询.
6.2dsphere 索引和相应的操作符来寻我附近的人
7. geoNear 命令搜索附近的点
8. GeoJSON 对象类型存储位置信息经纬度信息,支持类型:
9. Point 点
10.LineString 线
11.Polygon 多 形
12.MuitiPoint 多点
13.MultiLineStrina 多线
14.MultiPolvaon 多面体
15.GeometryCollection 地理集合
四,LBS 搜索附近的人—MongoDB 支持 GEO 索引
1. GEO 地理数据相关的索引有两种 2dsphere 和 2d
2。2d 支持平面搜索,2dsphere 主要支持球面
3.地理位置存储为 GeoJSON Point 类型
4. $geoNear 用于聚合查询
5.普通查询
6. db.createCollection("users")
7.db.users.save( { _id: "jack", position: [0.1121
-0.1211]})
8. db.users.save( {_id: "musk" , position: [1.1231,1.12312]})9. db.users.ensurelndex( {position: "2d"})
10.db.users.find( {position: { $near: [0,0], $maxDistance:
10
})
五,搜索附近的 X—SpringBoot+MongoDB 解决方案
l
l
org.springframework.boot
l
spring-boot-starter-data-mongodb
l
/**
*2D圆形查询,geoNear查询点附近的所有车辆,指定半径
*@param pint中心点
*@param radius半径,米
*@param limit限制数量
*@return
*/
public List geoNearQuery(Point point,double radius,int limit) {
List result =
mongoTemplate.find( new Query(
criteria.where( "location").near(point)
.maxDistance( radius)).limit( limit)
,carInfo.class);
return result;}
六,MongoDB 简介
1. NoSQL 排名第一,BAT 互联网公司必备
2.分布式数据库,
3. 由 C++语言编写,特点是高性能、易部署、易使用、存储数据非常方便,
4.旨在为 Web 应用提供可扩展的高性能数据存储解决方案
5. MongoDB 由10gen 团队所开发,于2009年2月首度推出
6. MongoDB 开源、跨平台
7.支持 Windows、Linux、OS X 和 Solaris 系统
8. MongoDB 最新版本为4.0,支持跨文档事务
MongoDB 优点示意图:
七,MongoDB版本特性
版本 |
关键特性 |
建议 |
2.X |
index、writeConcern、readPreference |
强烈建议升级 |
3.0 |
Pluggable Storage Engine、Wiredtiger. improved mmapv1 |
建议升级 |
3.2 |
Raft协议、文档校验、部分索引、inMemory. $lookup |
建议升级 |
3.4 |
并行复制、sharding迁移改进、collation、$facet. $graghLookup |
强烈建议使用 |
3.6 |
安全、并行性能、$lookup、Online 维护(在线添加认证) |
已经发布 |
4.0 |
分布式事务Transaction |
已经发布 |
八,Spring Data 2.6 MongoDB 新特性
1.简化 Java 的 MongoDB 数据库开发 API
2.提供一致的基于 Spring 的编程模型
3. Spring configuration 支持 @Configuration classes or an XML namespace
4.方便编写 Repository 仓储模式的 DAO 层代码
5.自动实现 Repository interface 的 CRUD 常 用操作
6.自动进行 POJO 和 MongoDB 文档数据的映射转换, Spring’s Conversion Service
7.可以自定义扩展方法
8. MongoTemplate helper class 提升 MongoDB 开发效率
9. Low-level mapping using MongoReader/MongoWriter abstractions
10.Java based Query,Criteria, and Update DSLs
11.Log4j log appender
12.Geospatial 集成
13.Map-Reduce 集成
14.JMX administration and monitoring15.CDI support for repositories
16.GridFS 支持
九,Repository 仓储层代码
public interface BlogRepository extends MongoRepository {
public Blog findById (objectId id);
public void delete(objectId id);public List findAll();
}
十,代码实操演示
首先加入 MongoDB 的依赖:
org.springframework.boot
spring-boot-starter-data-mongodb
2,去 MongoDB 官网下载 MongoDB
网址为 MongoDB.com
选择社区版的 MongoDB(MongoDB Community Server)
下载完之后可以在 Windows 上直接启动使用
进入 bin 目录找到 mongo.exe(客户端命令)
mongod.exe(MongoDB 的数据库服务命令),mongos.exe (路由器)
如何启动 MongoDB?
打开命令行界面:
先进入 MongoDB 的 bin 目录(cd\ MongoDB\bin)后:
输入一下指令:
mongod.exe--port 27017 --dbpath="../data"--logpath= "../log/mongo.log
注:linux 和苹果操作系统与 Windows 的操作同理
在命令行界面输入一下指令可查看当前持有的数据库:
show dbs
在Maven Dependencies 中可添加对应的 MongoDB 修改包 :
1 spring.application.name=SpringBoot260Demo
2 server.port=8088
3 spring.datasource.url=jdbc:mysql://localhost/alibaba?useSSL=false&serverTimez4spring.datasource.username=root
5 spring.datasource.password=1234qwer
6spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
7spring.jpa.database
platform=org.hibernate.dialect.MySQL5InnoDBDialect
8#mongodb
9 spring.data.mongodb.database=alibaba
10 spring.data.mongodb.host=localhost
11 spring.data.mongodb.port=270172
12 #spring.data.mongodb.username=root
13 #spring.data.mongodb.password=1234qwer
自定义数据仓:
//实体类代码展示
package com.alibaba.entity;
import java.io.Serializable;口@Document(collection = "carInfo")@CompoundIndexes({
@CompoundIndex(name = "location_index" , def = " { ' location': '2d'}"),})
public class CarInfo implements Serializable{
/**车辆*/
@Id
private int id:Ipublic int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
/****/
private static final long serialVersionUID = 1L;
/**车辆*/
private String car;
/**经度*/
/**纬度*/
private Double [] location;
public string getcar() {
return car;
}
I
public void setcar( String car) {
this.car = car;
}
public Double [] getLocation( ) {
//启动器代码展示
package com.alibaba;
import org.springframework.boot.SpringApplication;
@SpringBootApplication
public class JavaSpringBoot25x14MongoDb4GeoDemoApplication {
public static void main(string[] args){
SpringApplication.run(JavaSpringBoot25x14MongoDb4GeoDemoApplication.java
}
}
//controller 层代码展示
//找到对应的接口
package com.alibaba.api;
import java.text.DecimalFormat;口
@slf4j
@RequestMapping( "/cars")@RestController
public class CarController {
@Autowired
private MongoTemplate;
@GetMapping
public String helto() {i
return "Hello Java Spring Data MongoDB GEO";
}
@RequestMapping( " /batchupdate")public long batchUpdate() {
double lat = 31.228493791366265;//维度double lon = 121.47538375749718;//经度Long nowTime = System.currentTimeMillis();for (int i = 0; i < 1000; i++) f
List listCarInfo = new ArrayList<>(10000);Long nowTime] = System.currentTimeMillis();
for (int j = 0; j < 1000; j++) {
double max = 0.01;
double min = 0.000001;
Random = new Random();
double s = random.nextDouble() %(max - min + 1) + max;DecimalFormatdf=new DecimalFormat("###1##0.000000");l/ system.out.println(s) ;
来到浏览器进行测试:
输入 localhost:8001/cars/save
查看是否能够查询成功
在命令行界面输入一下指令查看信息:
>use Alibaba
>show tables
>db.CarInfo.cound()
回到 Eclipse 查看后天是否返回了以下信息:
更新100万汽车位置耗时:49555ms
更新100万汽车位置耗时:44056ms
可以在 entity 包中创建多个实体类进行测试:
如创建 User,CarInfo
在 controller 层中创建 UserController
在 controller 层中创建 CarInfoController
课后推荐:高级面试题
1. Spring Data for MongoDB 映射机制
2.官方驱动是什么
3. MongoDB 存储什么数据? NoSQL,面向文档 JSON
4. MongoDB 优缺点
5.MongoDB 几大存储引擎
6.数据复制的过程
7.索引类型
8.性能优化
9.性能监控
10. GEO 索引算法