MongoDB

一、MongoDB简介

1.1 什么是MongoDB?

MongoDB是一个基于分布式文件存储的开源NoSQL数据库系统,由C++语言编写,旨在为Web应用提供可扩展的高性能数据存储解决方案。MongoDB将数据存储为一个文档,数据结构由键值对组成,类似于JSON对象,字段值可以包含其他文档、数组及文档数组。

1.2 MongoDB的核心特性

  • 文档型数据库:数据以BSON(Binary JSON)格式存储
  • 灵活的数据模型:无需预定义模式,字段可以动态添加
  • 强大的查询语言:支持丰富的查询表达式
  • 高性能:支持索引,包括文本搜索和地理空间索引
  • 高可用性:通过复制集提供数据冗余和自动故障转移
  • 水平扩展:通过分片实现数据分布式存储
  • 支持聚合和MapReduce:用于数据处理和分析

1.3 基本概念

  • 数据库(Database):MongoDB中多个集合的物理容器
  • 集合(Collection):类似于关系数据库中的表
  • 文档(Document):类似于关系数据库中的行,使用BSON格式存储
  • 字段(Field):类似于关系数据库中的列
  • 索引(Index):提高查询效率的数据结构
  • 复制集(Replica Set):提供数据冗余和高可用性
  • 分片(Sharding):数据分布式存储的方法

1.4 与传统SQL数据库的比较

特性 MongoDB 关系型数据库
数据模型 文档模型 表格模型
数据结构 灵活,无模式 固定,需要预定义结构
查询语言 JSON风格查询 SQL
事务支持 4.0版本开始支持 完全支持
水平扩展 原生支持 通常需要额外工具
复杂关联查询 使用$lookup,性能相对较低 通过JOIN支持,性能更好
适用场景 大数据量、高并发、弱事务 强事务、复杂查询、结构化数据

二、MongoDB基础

2.1 文档结构和BSON

MongoDB使用BSON(Binary JSON)格式存储数据。BSON扩展了JSON模型,提供了更多的数据类型和更高效的编码解码。

一个典型的MongoDB文档结构如下:

{
   "_id": ObjectId("5f8d3b4e9d3b2c8e9c8b4567"),
   "name": "张三",
   "age": 30,
   "email": "[email protected]",
   "address": {
       "city": "北京",
       "postal_code": "100000"
   },
   "tags": ["开发", "Java", "MongoDB"]
}

2.2 MongoDB支持的数据类型

  • 字符串:UTF-8字符串
  • 整数:32位或64位整数
  • 布尔值:true或false
  • 双精度浮点数:IEEE 754浮点数
  • 数组:值的列表或数组
  • 对象:嵌入式文档
  • 对象ID:12字节的唯一标识符
  • 日期:Unix时间格式(精确到毫秒)
  • Null:表示空值或不存在的字段
  • 正则表达式:使用JavaScript的正则表达式语法
  • 二进制数据:用于存储非UTF-8字符串的二进制数据
  • 代码:JavaScript代码

2.3 基本CRUD操作

创建操作(Create)
// 插入单个文档
db.users.insertOne({
    name: "李四",
    age: 25,
    email: "[email protected]"
});

// 插入多个文档
db.users.insertMany([
    { name: "王五", age: 35, email: "[email protected]" },
    { name: "赵六", age: 28, email: "[email protected]" }
]);
读取操作(Read)
// 查询所有文档
db.users.find();

// 条件查询
db.users.find({ age: { $gt: 30 } });

// 查询指定字段
db.users.find({}, { name: 1, email: 1, _id: 0 });

// 限制结果数量
db.users.find().limit(5);

// 排序
db.users.find().sort({ age: -1 });
更新操作(Update)
// 更新单个文档
db.users.updateOne(
    { name: "李四" },
    { $set: { age: 26, "address.city": "上海" } }
);

// 更新多个文档
db.users.updateMany(
    { age: { $lt: 30 } },
    { $inc: { age: 1 } }
);

// 替换整个文档
db.users.replaceOne(
    { name: "王五" },
    { name: "王五", age: 36, email: "[email protected]" }
);
删除操作(Delete)
// 删除单个文档
db.users.deleteOne({ name: "李四" });

// 删除多个文档
db.users.deleteMany({ age: { $gt: 30 } });

// 删除所有文档
db.users.deleteMany({});

2.4 索引

MongoDB支持多种类型的索引,用于提高查询性能。

// 创建单字段索引
db.users.createIndex({ name: 1 });  // 1表示升序,-1表示降序

// 创建复合索引
db.users.createIndex({ name: 1, age: -1 });

// 创建唯一索引
db.users.createIndex({ email: 1 }, { unique: true });

// 创建文本索引
db.articles.createIndex({ content: "text" });

// 创建地理空间索引
db.places.createIndex({ location: "2dsphere" });

// 查看集合上的所有索引
db.users.getIndexes();

// 删除索引
db.users.dropIndex({ name: 1 });

2.5 聚合操作

MongoDB提供了强大的聚合框架,用于对数据进行转换和计算。

// 简单的聚合示例:按年龄分组并计算平均值
db.users.aggregate([
    { $group: { _id: null, avgAge: { $avg: "$age" } } }
]);

// 使用多个聚合管道阶段
db.orders.aggregate([
    { $match: { status: "completed" } },
    { $group: { _id: "$customer_id", totalAmount: { $sum: "$amount" } } },
    { $sort: { totalAmount: -1 } },
    { $limit: 5 }
]);

// 使用$lookup进行关联查询(类似SQL中的JOIN)
db.orders.aggregate([
    {
        $lookup: {
            from: "customers",
            localField: "customer_id",
            foreignField: "_id",
            as: "customer_info"
        }
    }
]);

三、Spring Boot简介

3.1 Spring Boot概述

Spring Boot是Spring框架的扩展,简化了基于Spring的应用程序开发。它消除了设置Spring应用程序所需的大量样板代码和配置,使开发人员能够快速启动和运行应用程序。

3.2 Spring Boot的核心特性

  • 自动配置:自动配置Spring应用程序基于类路径上的依赖
  • 起步依赖:简化Maven/Gradle配置
  • 嵌入式服务器:内嵌Tomcat、Jetty或Undertow
  • 生产就绪功能:健康检查、指标、外部化配置

3.3 Spring Data MongoDB

Spring Data MongoDB是Spring Data家族的一部分,专为使用MongoDB数据库的应用程序提供Spring风格的数据访问抽象。它提供了以下功能:

  • 基于接口的数据访问层抽象
  • 无需编写具体实现的Repository支持
  • 基于方法名称的查询构建
  • 自定义查询注解支持
  • MongoDB原生操作集成
  • 地理空间支持
  • 基于MongoDB的审计支持

四、Spring Boot整合MongoDB

4.1 项目依赖配置

在Spring Boot项目中添加MongoDB依赖非常简单,只需在pom.xml文件中添加以下依赖:



    org.springframework.boot
    spring-boot-starter-data-mongodb

或者在Gradle的build.gradle文件中:

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'
}

4.2 MongoDB连接配置

在Spring Boot的application.propertiesapplication.yml文件中配置MongoDB连接信息:

application.properties:

# MongoDB连接配置
spring.data.mongodb.uri=mongodb://localhost:27017/mydatabase

# 或者使用详细配置
spring.data.mongodb.host=localhost
spring.data.mongodb.port=27017
spring.data.mongodb.database=mydatabase
spring.data.mongodb.username=admin
spring.data.mongodb.password=password
spring.data.mongodb.authentication-database=admin

application.yml:

spring:
  data:
    mongodb:
      uri: mongodb://localhost:27017/mydatabase
      # 或者使用详细配置
      #host: localhost
      #port: 27017
      #database: mydatabase
      #username: admin
      #password: password
      #authentication-database: admin

4.3 配置MongoDB连接工厂

大多数情况下,Spring Boot的自动配置足以满足需求。但如果需要自定义MongoDB配置,可以创建一个配置类:

import com.mongodb.ConnectionString;
import com.mongodb.MongoClientSettings;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;

@Configuration
@EnableMongoRepositories(basePackages = "com.example.repository")
public class MongoConfig {

    @Bean
    public MongoClient mongoClient() {
        ConnectionString connectionString = new ConnectionString("mongodb://localhost:27017/mydatabase");
        MongoClientSettings mongoClientSettings &

你可能感兴趣的:(MongoDB,mongodb,数据库)