当前位置: 首页 > news >正文

NoSql文档型数据库——Mongodb

MongoDB简介

MongoDB是一个开源、高性能、无固定模式、高可用性的文档型数据库。是NoSQL数据库产品中的一种,是最像关系型数据库(MySQL)的非关系型数据库。

它支持的数据结构非常灵活,是一种类似于JSON的格式叫BSON,所以它既可以存储结构化的数据类型,又相当的灵活。

MongoDB中的记录是一个文档,它是由字段和值(field:value)组成的数据结构。MongoDB文档类似于JSON对象,即一个文档将被认为是一个对象。字段的数据类型是丰富的,它的值可以使用基本的类型,也包括其他文档、普通数组和文档数组。

MongoDB支持丰富的査询语言,支持读和写操作(CRUD),比如数据聚合、文本搜索和地理空间查询等

mongodb里的基本术语

  • 数据库(Database): MongoDB 可以包含多个数据库,每个数据库都有自己的集合。数据库是数据的逻辑分组。

  • 集合(Collection):相当于关系数据库中的表,包含多个文档。

  • 文档(Document):相当于关系数据库中的行,使用BSON格式存储数据。

    • 文档的数据结构是灵活的,可以根据需要添加不同的字段。
  • 键(Key):相当于数据库里的字段(区分大小写,不能重复)。

应用场景

  • 社交场景

    • 使用 MongoDB存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能。
  • 游戏场景

    • 使用 MongoDB存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、高效率存储和访问。
  • 物流场景

    • 使用 MongoDB存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来
  • 物联网场景

    • 使用 MongoDB存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析。

    • 视频直播,使用 MongoDB存储用户信息、点赞互动信息等。

不适用场景

  1. 需要复杂事务的金融系统(尽管支持事务,但不如关系型数据库成熟)。
  2. 高度规范化的数据(如会计系统,多表关联查询频繁)。
  3. 对JOIN操作依赖极强的场景(MongoDB需通过应用层或嵌入文档替代)。

这些应用场景中的共同特点是:

(1)数据量大

(2)读写频繁

(3)价值较低的数据,对事务性要求不高

(4)数据模型多变

高性能与高可用性的实现

MongoDB 通过 内存加速访问 + 磁盘保障持久化,实现了高性能与可靠性的平衡。

场景存储位置说明
正常读写内存 + 磁盘热数据在内存,冷数据在磁盘。
重启后数据磁盘依赖持久化存储引擎(如 WiredTiger)。
纯内存模式(企业版)仅内存高性能但非持久化,重启后数据丢失。

安装和配置

下载地址:https://fastdl.mongodb.org/windows/mongodb-windows-x86_64-6.0.22.zip

之后创建mongod.conf文件:“…\MongoDB\mongodb-win32-x86_64-windows-6.0.22\conf\mongod.conf"以及存储目录:”…\MongoDB\mongodb-win32-x86_64-windows-6.0.22\data\db",并在内写入:

storage:dbPath: C:\data\db #你的db地址
net:port: 27017bindIp: 127.0.0.1

最后写一个.bat的执行脚本

@echo off  
D:\nacos\MongoDB\mongodb-win32-x86_64-windows-6.0.22\bin\mongod.exe --config=D:\nacos\MongoDB\mongodb-win32-x86_64-windows-6.0.22\conf\mongod.conf  
pause  

点击执行这个脚本文件就可以执行了。

最后在浏览器里输入:localhost:27017,看有没有显示如下文本:

It looks like you are trying to access MongoDB over HTTP on the native driver port.

idea连接mongodb

如果有一个idea就不要下载别了MongoDb图形化工具,idea内集成了各种数据库图形化工具,只需要安装插件即可。

命令操作mongodb(了解)

主要特点:

  • 一个集合可以包含多个文档,但一个文档只能属于一个集合。
  • 文档的数据结构是灵活的,可以根据需要添加不同的字段。

数据库操作

  • show dbs - 显示所有数据库
  • use <db_name> - 切换到指定数据库(如果不存在则创建)
  • db - 显示当前使用的数据库
  • db.dropDatabase() - 删除当前数据库

集合操作

  • show collections - 显示当前数据库中的所有集合
  • db.createCollection("collection_name") - 创建新集合
  • db.collection_name.drop() - 删除集合

CRUD 操作

插入文档
// 插入单个
db.collection_name.insertOne({field1: "value1",field2: "value2",...
})
//插入多个
db.collection_name.insertMany([{field1: "value1", field2: "value2"},{field1: "value3", field2: "value4"},...
])
查询文档

javascript

db.collection_name.find()  // 查询所有文档
db.collection_name.findOne({document})  // 查询单个文档
db.collection_name.find({key: value})  // 条件查询
db.collection_name.find().pretty()  // 格式化输出
更新文档
// 更新单个文档
db.collection_name.updateOne({filter_field: "filter_value"},  // 筛选条件{$set: {field1: "new_value"}}    // 更新操作
)  
// 更新多个文档
db.collection_name.updateMany({filter_field: "filter_value"},{$set: {field1: "new_value"}}
) // 替换文档
db.collection_name.replaceOne({filter_field: "filter_value"},{new_document}
)
删除文档
db.collection_name.deleteOne({field: "value"})  // 删除单个文档
db.collection_name.deleteMany({field: "value"})  // 删除多个文档

springboot操作mongodb

先导入依赖
<dependency> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>
在application.yaml里配置
# application.yml
spring:data:mongodb:host: localhostport: 27017database: testdbusername: userpassword: pass
创建实体类
@Document(collection = "users")
@CompoundIndex(def = "{'name': 1, 'age': -1}") //在实体类上定义复合索引:name升序age降序
@Data
public class User {@Id // 标记主键private String id;private String name;private Integer age;private String email;@GeoSpatialIndexed(type = GeoSpatialIndexType.GEO_2DSPHERE)private GeoJsonPoint location;  // 使用 Spring Data 的 GeoJsonPoint
}
创建 Repository 接口

Spring Data MongoDB 提供了Repository接口:

import org.springframework.data.mongodb.repository.MongoRepository;
// MongoRepository<mongodb集合的实体类, 主键的类型>
public interface UserRepository extends MongoRepository<User, String> {// 自定义查询方法
//    User findByName(String name);
//    List<User> findByAgeGreaterThan(int age);
}
通过MongoTemplate 进行复杂操作
@Service
public class UserService {@Autowiredprivate MongoTemplate mongoTemplate;// 插入文档public User addUser(User user) {return mongoTemplate.insert(user);}// 查询所有public List<User> findAll() {return mongoTemplate.findAll(User.class);}// 条件查询public List<User> findUsersByName(String name) {Query query = new Query(Criteria.where("name").is(name));return mongoTemplate.find(query, User.class);}// 更新文档public void updateUserEmail(String name, String newEmail) {Query query = new Query(Criteria.where("name").is(name));Update update = new Update().set("email", newEmail);mongoTemplate.updateFirst(query, update, User.class);}// 删除文档public void deleteUser(String id) {Query query = new Query(Criteria.where("id").is(id));mongoTemplate.remove(query, User.class);}// 范围查询public List<Place> findNearbyPlaces(double longitude, double latitude, double distanceInMeters) {// 1. 构造中心点Point center = new Point(longitude, latitude);// 2. 构造距离范围Distance radius = new Distance(distanceInMeters, Metrics.METERS);// 3. 创建查询条件Query query = Query.query(Criteria.where("location").nearSphere(center)  // 球面距离计算.maxDistance(radius.getNormalizedValue())  // 转换为弧度); // 4. 执行查询return mongoTemplate.find(query, Place.class);}
}

Mongodb操作Geojson格式的数据

@GetMapping("/quary")public GeoJsonPoint quaryDriver() {Driver driver = new Driver();GeoJsonPoint location = new GeoJsonPoint(120.74, 31.33); // 经度和纬度driver.setLocation(location);driver.setPlateNumber("浙A12345");driver.setAcceptCustomerDistance(5f);driver.setAcceptOrderDistance(20f);driver.setStatus(1);System.out.println(driver.getLocation());return driver.getLocation();}

首先要认识到,springboot操作Mongodb里的地理空间数据虽然使用sout打印出来的结果类似于下面的情况:

Point [x=120.740000, y=31.330000]

但是如果是前端请求得到的响应里的数据是下面这样:

{"x":120.74,"y":31.33,"type":"Point","coordinates":[120.74,31.33]}

上面的这个是一个geojson格式的的数据(虽然前面有x和y,但依旧可以渲染在地图上),这是Spring Data MongoDB 的序列化行为

Geojson网页在线加载:添加链接描述
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

相关文章:

  • Apache中间件解析漏洞与安全加固
  • Python流程控制
  • FANUC机器人GI与GO位置数据传输设置
  • 初识Redis · 事务
  • 项目组合管理PPM
  • 5.4.云原生与服务网格
  • uniapp返回上一页接口数据更新了,页面未更新
  • Lua 第9部分 闭包
  • 官方不存在tomcat10-maven-plugin插件
  • Linux内核源码结构
  • ApacheJmeter使用权威指南
  • Maven 工程中的pom.xml 文件(图文)
  • Python3(6) 运算符
  • 【解读】Chrome 浏览器实验性功能全景
  • Windows:注册表配置应用
  • STM32F103 “BluePill” 上的 DMA 原理与实践
  • Javase 基础入门 —— 03 面向对象编程
  • 欧拉环境(openEuler 22.03 LTS SP3)安装移动磐维数据库(PanWeiDB_V2.0-S2.0.2_B01)步骤
  • 【漫话机器学习系列】219.支持向量机分类器(Support Vector Classifier)
  • 【异常解决】Spring Boot 返回排序后的 Map 但前端接收顺序不对的解决方案
  • 再放宽!新版市场准入负面清单发布,无人驾驶航空器、电子烟等新业态被纳入
  • 富力地产:广州富力空港假日酒店第一次拍卖流拍,起拍价约2.77亿元
  • 董明珠卸任格力电器总裁,张伟接棒
  • 骑手眼中的“外卖战”
  • 现货黄金价格站上3400美元,今年迄今累涨逾29%
  • 盗播热门影视剧、电影被追究刑事附带民事责任,最高法发声