使用 MongoDB 搜索附近的人|学习笔记

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 快速学习使用 MongoDB 搜索附近的人

开发者学堂课程【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,地图分割不同区域,二维坐标生成一个

字符串

image.png

 

二,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 优点示意图:

image.png


七,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 索引算法


相关文章
|
存储 自然语言处理 NoSQL
D7 Elasticsearch-Mongodb(搜索记录)
D7 Elasticsearch-Mongodb(搜索记录)
90 0
|
监控 NoSQL MongoDB
MongoDB全文检索: 助力快速精准的文本搜索
MongoDB全文检索: 助力快速精准的文本搜索
792 0
|
存储 NoSQL Ubuntu
百度搜索:蓝易云【如何在Ubuntu上安装MongoDB?】
请注意,具体的命令和步骤可能因MongoDB的版本和Ubuntu的版本而有所不同。请根据你使用的具体版本进行相应的调整。
149 3
|
NoSQL 安全 Linux
百度搜索:蓝易云【CentOS7安装MongoDB教程】
这些是在CentOS 7上安装MongoDB的基本步骤。根据您的需求和具体环境,可能还需要进行其他配置和调整。请确保在进行任何与网络连接和安全相关的操作之前,详细了解您的网络环境和安全需求,并采取适当的安全措施。
243 0
|
NoSQL MongoDB Docker
百度搜索:蓝易云【Scrapy框架之Docker安装MongoDB教程。】
现在,你已经成功在Scrapy框架中使用Docker安装并配置了MongoDB。你可以在Scrapy爬虫中使用MongoDB进行数据存储和处理。
300 0
|
NoSQL Linux MongoDB
百度搜索:蓝易云【如何在 RHEL 8 或者 CentOS 8 上安装 MongoDB?】
以上是在RHEL 8或CentOS 8上安装MongoDB的基本步骤。安装完成后,您可以使用MongoDB的客户端工具连接到MongoDB服务器,并开始使用它进行数据库操作。希望这些步骤能够帮助您在RHEL 8或CentOS 8上成功安装MongoDB。
156 0
|
存储 监控 NoSQL
MongoDB 快速入门-MongoDB 最佳实践(二)|学习笔记
快速学习 MongoDB 快速入门-MongoDB 最佳实践(二)
551 0
MongoDB 快速入门-MongoDB 最佳实践(二)|学习笔记
|
存储 JSON NoSQL
【BackEnd--Mongodb】学习笔记(完整详细版)
MongoDB是一种面向文档的非关系型数据库,所谓的面向文档是一种类似JSON的结构,因此可以简单理解MongoDB存储的是各种各样的JSONMongoDB可以快速开发web型应用,因为存储的是JSON格式,因此无需像关系型数据库那样需要建表,非常的的灵活。
387 0
|
NoSQL 关系型数据库 MySQL