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",并在内写入:

bash 复制代码
storage:
  dbPath: C:\data\db #你的db地址
net:
  port: 27017
  bindIp: 127.0.0.1

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

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 操作

插入文档
java 复制代码
// 插入单个
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

先导入依赖
xml 复制代码
<dependency> 
	    <groupId>org.springframework.boot</groupId>
	    <artifactId>spring-boot-starter-data-mongodb</artifactId>
	</dependency>
在application.yaml里配置
yaml 复制代码
# application.yml
spring:
  data:
    mongodb:
      host: localhost
      port: 27017
      database: testdb
      username: user
      password: pass
创建实体类
java 复制代码
@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接口:

java 复制代码
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 进行复杂操作
java 复制代码
@Service
public class UserService {
     @Autowired
    private 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格式的数据

java 复制代码
@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网页在线加载:添加链接描述

相关推荐
李菠菜20 分钟前
SpringBoot中MongoDB大数据量查询慢因实体映射性能瓶颈优化
spring boot·后端·mongodb
聪明的墨菲特i39 分钟前
SQL进阶知识:三、事务控制
数据库·sql·mysql·数据库开发·事务控制
·薯条大王44 分钟前
Node.js 开发用户登录功能(使用mysql实现)
数据库·mysql·node.js
朴拙数科1 小时前
基于Python将MongoDB文本数据通过text2vec-large-chinese模型向量化并存储到Milvus数据库的完整实现方案
数据库·python·mongodb
咸鱼睡不醒_2 小时前
CentOS7安装MySQL教程
数据库·mysql
E___V___E2 小时前
黑马点评redis改 part 5
数据库·redis·缓存
打码人的日常分享2 小时前
网络安全风险评估报告书模版(Word)
运维·数据库·微服务·制造·需求分析
ONETHING_CLOUD_23 小时前
设备存储空间不足怎么办?
数据库·电脑·备份·数据存储·网盘·存储空间·数码知识
用户6279947182623 小时前
南大通用GBase 8a gn层物理存储结构介绍
数据库