Mongodb简单使用
记录mongodb的下载安装及单表crud,及空间索引的简单使用
1.下载安装
安装4.0.28 版本
注意:windows端高版本的安装包,取消了mongo.exe 所以在环境变量中添加了mondodb的path后仍然不可全局使用
官网:https://www.mongodb.com/try/download/community
安装步骤
1.选择custom
2.选择安装路径
3.取消勾选,先不安装图形化工具,否则时间非常非常长
4.安装好后配置
在安装目录,bin目录的同级创建一个mongodb.conf
systemLog:
destination: file
# 指定日志存放文件
path: D:\MongoDB\Server\4.0\log\mongodb.log
logAppend: true
storage:
journal:
enabled: true
# 指定存放数据文件的全路径
dbPath: D:\MongoDB\Server\4.0\data\db
net:
bindIp: 127.0.0.1
port: 27017
setParameter:
enableLocalhostAuthBypass: false
或者修改bin目录下的mongod.cfg
启动命令
用管理员身份打开 cmd,然后找到 bin 文件地址为:"D:\Mongodb\Server\bin ‘’,并输入代码
而命令中的 ‘MongoDB’ 就是之后启动 MongoDB 服务的名字;
D:\MongoDB\Server\4.0\bin\mongod.exe --config "D:\MongoDB\Server\4.0\bin\mongod.cfg" -install -serviceName "MongoDB"
也可以指定其他参数
dbpath "D:\Mongodb\Server\data\db" -logpath "D:\Mongodb\Server\data\log\mongo.log"
验证页面
http://localhost:27017/
2.springboot + mongodb
pom文件中引入mongodb的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>2.1.9.RELEASE</version>
</dependency>
配置文件中加入mongodb的配置
3.简单使用
MongoDB与关系型数据库的基本表结构对比:
MongoDB和关系型数据库之间有以下几个主要的异同点:
- 数据模型:关系型数据库使用表格来存储数据,而MongoDB使用文档来存储数据。文档是一种类似于JSON的数据结构,可以包含嵌套的数据和数组。这使得MongoDB更适合存储非结构化数据。
- 数据查询:关系型数据库使用SQL语言进行查询,而MongoDB使用基于文档的查询语言。MongoDB的查询语言支持嵌套文档和数组,可以更方便地查询非结构化数据。
- 数据扩展性:MongoDB可以水平扩展,即通过添加更多的服务器来增加存储容量和处理能力。关系型数据库则通常需要垂直扩展,即通过增加更多的硬件资源来增加处理能力。
- 数据一致性:关系型数据库通常使用ACID事务来保证数据一致性,而MongoDB则使用基于副本集和分片的方式来保证数据一致性。
- 数据安全性:关系型数据库通常提供较为完善的安全性控制,如用户认证、访问控制等。MongoDB也提供了类似的安全性控制,但相对较为简单。
总的来说,MongoDB更适合存储非结构化数据和需要水平扩展的场景,而关系型数据库则更适合存储结构化数据和需要事务保证数据一致性的场景。
1.创建一个实体类,Document代表数据库集合,也就是关系型数据库中的表。
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.geo.GeoJson;
import org.springframework.data.mongodb.core.mapping.Document;
@Data
@Document("sphere")
public class Sphere {
@Id
private String id;
private String name;
//地理空间数据
private GeoJson location;
}
2.引入mongoTemplate对象
3.MongoTemplate 的一些查用方法
方法名 | 描述 |
---|---|
insert(Object objectToSave, String collectionName) | 向指定集合中插入一个文档,如果文档存在则抛出异常 |
save(Object objectToSave, String collectionName) | 保存一个文档,如果文档已存在则更新 |
find(Query query, Class entityClass, String collectionName) | 根据查询条件查询文档 |
findOne(Query query, Class entityClass, String collectionName) | 根据查询条件查询单个文档 |
updateFirst(Query query, Update update, Class entityClass, String collectionName) | 根据查询条件更新第一个匹配的文档 |
updateMulti(Query query, Update update, Class entityClass, String collectionName) | 根据查询条件更新所有匹配的文档 |
remove(Query query, Class entityClass, String collectionName) | 根据查询条件删除文档 |
其中,entityClass表示文档对应的Java类,collectionName表示集合名称。
增
保存单个对象可以使用save方法,mongo中如果我们不设置id,会自动生成。
Sphere sphere = new Sphere();
sphere.setName("点");
sphere.setLocation(new GeoJsonPoint(10,15));
mongoTemplate.save(sphere);
数据库中会生成这样的一条记录,代表一个document,也就是关系型数据库中的一行数据
以类json的文档的格式进行存储,如下
批量插入可以使用insert方法,insert方法的一些参数
save方法用于保存一个对象到MongoDB中。如果该对象已经存在于MongoDB中,则会更新该对象的数据。如果该对象不存在于MongoDB中,则会将该对象插入到MongoDB中。save方法的参数可以是一个单独的对象,也可以是一个对象列表。
insert方法用于将一个对象或对象列表插入到MongoDB中。如果插入的对象已经存在于MongoDB中,则会抛出DuplicateKeyException异常。insert方法的参数可以是一个单独的对象,也可以是一个对象列表。
因此,save方法和insert方法的主要区别在于对于已经存在于MongoDB中的对象的处理方式。save方法会更新该对象的数据,而insert方法会抛出异常。另外,save方法也可以用于插入新的对象到MongoDB中。
删
Query query = Query.query(Criteria.where("_id").is("647e9198942c2632e8eff884"));
mongoTemplate.remove(query,Sphere.class);
可以使用Query对象来指定查询条件,也可以使用Criteria对象来构建查询条件。
改
Query query = Query.query(Criteria.where("_id").is("4c4b12ae-79e0-44af-bbfb-5d4f2224dd52"));
Update update = new Update().set("name","111");
mongoTemplate.updateFirst(query, update, Sphere.class);
查
等于查询
Criteria.where("_id").is("647e9198942c2632e8eff884")
模糊查询
//"^."表示以任意字符开头,".$"表示以任意字符结尾,"keyword"表示要匹配的关键字,Pattern.CASE_INSENSITIVE表示忽略大小写。
Pattern pattern = Pattern.compile("^.keyword.$", Pattern.CASE_INSENSITIVE);
Criteria.where("studentName").regex(pattern)
指定字段返回
Query query = new Query();
query.fields().include("_id");
4.空间索引
MongoDB中的空间索引是一种特殊类型的索引,用于支持地理空间数据的查询。它可以帮助用户在MongoDB中存储和查询地理空间数据,例如地图上的点、线和多边形等。在MongoDB中,空间索引可以使用2dsphere和2d两种类型来创建
2dsphere和2d是MongoDB中两种不同的空间索引类型。
2d索引是MongoDB中最早的空间索引类型,它只支持平面上的二维数据,例如经纬度坐标。2d索引使用了B树数据结构,可以快速地查询和过滤平面上的数据。但是,2d索引不支持球面上的数据,例如地球表面上的点、线和多边形等。
2dsphere索引是MongoDB中较新的空间索引类型,它支持球面上的数据,例如地球表面上的点、线和多边形等。2dsphere索引使用了一种特殊的数据结构,称为GeoJSON,可以快速地查询和过滤球面上的数据。2dsphere索引还支持更多的地理空间数据类型和查询操作,例如计算两个球面上点之间的距离、判断一个点是否在一个球面上的多边形内等。
因此,如果需要存储和查询球面上的地理空间数据,应该使用2dsphere索引;如果只需要存储和查询平面上的二维数据,可以使用2d索引。
创建索引
mongoTemplate.indexOps("sphere").ensureIndex(new GeospatialIndex("location.coordinates").typed(GeoSpatialIndexType.GEO_2DSPHERE));
sphere是collectionName,location.coordinates是需要建立索引的字段
在java代码中可以使用GeoJsonPoint,GeoJsonLineString,GeoJsonPolygon来创建点、线、多边形
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BPKf8FF1-1693274427190)(image/image-20230606140824782.png)]
创建索引时,需要指定到coordinates这个字段上。
在创建GeoJsonPolygon对象时,需要按照顺序连接起来形成一个封闭的多边形,即第一个点和最后一个点需要相同。因此,点的顺序可以从任意一个点开始,只需要确保最后一个点和第一个点相同即可。
空间查询
near查询
Query query = new Query();
query.addCriteria(Criteria.where("location.coordinates").near( new Point(25,30)));
结果会跟据与定位点的距离返回
within查询
Box box = new Box(new Point(15,15),new Point(30,30));
query.addCriteria(Criteria.where("location.coordinates").within(box));
box根据左下点和右上点定义一个矩形,within返回定位点在矩形内的数据
如果需要返回不在矩形内的可以使用.not
query.addCriteria(Criteria.where("location.coordinates").within(box).not());
Query query = new Query();
query.addCriteria(Criteria.where("location").within(new Circle(10, 20, 5)));
List<GeoData> result = mongoTemplate.find(query, GeoData.class);
new Circle(10, 20, 5)表示要查询的圆形区域,其中10和20分别表示圆心的经纬度坐标,5表示圆的半径
Polygon points = new Polygon()表示一个多边形。
相交
//创建一个GeoJsonPolygon对象
GeoJsonPolygon polygon = new GeoJsonPolygon(
new Point(longitude1, latitude1),
new Point(longitude2, latitude2),
new Point(longitude3, latitude3),
new Point(longitude4, latitude4),
new Point(longitude1, latitude1)
);
Query query = new Query(Criteria.where("location").intersects(polygon));
Criteria.where("location").intersects(polygon)表示查询与多边形相交的文档