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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 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 索引算法


相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
6月前
|
存储 自然语言处理 NoSQL
D7 Elasticsearch-Mongodb(搜索记录)
D7 Elasticsearch-Mongodb(搜索记录)
46 0
|
6月前
|
监控 NoSQL MongoDB
MongoDB全文检索: 助力快速精准的文本搜索
MongoDB全文检索: 助力快速精准的文本搜索
335 0
|
存储 NoSQL Ubuntu
百度搜索:蓝易云【如何在Ubuntu上安装MongoDB?】
请注意,具体的命令和步骤可能因MongoDB的版本和Ubuntu的版本而有所不同。请根据你使用的具体版本进行相应的调整。
88 3
|
7月前
|
NoSQL 安全 Linux
百度搜索:蓝易云【CentOS7安装MongoDB教程】
这些是在CentOS 7上安装MongoDB的基本步骤。根据您的需求和具体环境,可能还需要进行其他配置和调整。请确保在进行任何与网络连接和安全相关的操作之前,详细了解您的网络环境和安全需求,并采取适当的安全措施。
181 0
|
7月前
|
NoSQL MongoDB Docker
百度搜索:蓝易云【Scrapy框架之Docker安装MongoDB教程。】
现在,你已经成功在Scrapy框架中使用Docker安装并配置了MongoDB。你可以在Scrapy爬虫中使用MongoDB进行数据存储和处理。
248 0
|
NoSQL Linux MongoDB
百度搜索:蓝易云【如何在 RHEL 8 或者 CentOS 8 上安装 MongoDB?】
以上是在RHEL 8或CentOS 8上安装MongoDB的基本步骤。安装完成后,您可以使用MongoDB的客户端工具连接到MongoDB服务器,并开始使用它进行数据库操作。希望这些步骤能够帮助您在RHEL 8或CentOS 8上成功安装MongoDB。
99 0
|
存储 JSON NoSQL
【BackEnd--Mongodb】学习笔记(完整详细版)
MongoDB是一种面向文档的非关系型数据库,所谓的面向文档是一种类似JSON的结构,因此可以简单理解MongoDB存储的是各种各样的JSONMongoDB可以快速开发web型应用,因为存储的是JSON格式,因此无需像关系型数据库那样需要建表,非常的的灵活。
267 0
|
NoSQL 关系型数据库 MySQL
|
存储 监控 NoSQL
MongoDB 快速入门-MongoDB 最佳实践(二)|学习笔记
快速学习 MongoDB 快速入门-MongoDB 最佳实践(二)
479 0
MongoDB 快速入门-MongoDB 最佳实践(二)|学习笔记