MongoDB

以下是 MongoDB 的详细介绍,涵盖核心概念、特性、适用场景及快速入门指南:


一、MongoDB 的核心概念与特点

MongoDB 是一个开源的 NoSQL 文档数据库 ,专为灵活性和可扩展性设计。与传统关系型数据库(如 MySQL)不同,MongoDB 以 JSON-like 格式(BSON) 存储数据,无需固定表结构。

1. 核心特性
  • 文档模型

    数据以 文档(Document) 形式存储,每个文档是一个键值对集合(类似 JSON),支持嵌套结构和动态字段。

    复制代码
    {
      "_id": ObjectId("5f9d1a2b3c4d5e6f7a8b9c0d"),
      "name": "Alice",
      "age": 30,
      "address": {
        "city": "New York",
        "zip": "10001"
      },
      "hobbies": ["reading", "hiking"]
    }
  • 灵活的模式(Schema-less)

    无需预定义表结构,可动态添加或修改字段,适合需求频繁变化的场景。

  • 高性能

    支持内存映射、索引优化和聚合管道,读写速度快,尤其适合高并发场景。

  • 水平扩展(Sharding)

    通过分片技术将数据分布到多台机器,支持海量数据存储和高吞吐量。

  • 高可用性

    通过 副本集(Replica Set) 实现自动故障转移,数据冗余存储,确保服务不中断。

  • 丰富的查询语言

    支持复杂查询(范围、正则、聚合)、地理空间查询和全文搜索。


二、MongoDB vs 关系型数据库

特性 MongoDB 关系型数据库(如 MySQL)
数据模型 文档模型(动态模式) 表模型(固定模式)
扩展方式 水平扩展(分片) 垂直扩展(硬件升级)
事务支持 支持多文档事务(4.0+) 完全支持 ACID 事务
适用场景 非结构化数据、快速迭代 结构化数据、复杂关联查询
查询语言 MongoDB Query Language (MQL) SQL

三、核心组件与架构

1. 核心概念
  • 数据库(Database):逻辑容器,包含多个集合。

  • 集合(Collection):类似表,存储一组文档。

  • 文档(Document):数据的基本单元,对应表中的一行。

  • 索引(Index):加速查询,支持单字段、复合、全文、地理空间等类型。

2. 高可用架构(副本集)
  • 一个副本集包含:

    • Primary 节点:处理所有写操作。

    • Secondary 节点:复制 Primary 数据,提供读操作。

    • Arbiter 节点(可选):不存储数据,仅参与选举。

  • 若 Primary 宕机,Secondary 自动选举新 Primary。

3. 水平扩展架构(分片集群)
  • 分片(Shard):存储数据的子集(如每个分片是一个副本集)。

  • 路由(Mongos):接收客户端请求,路由到对应分片。

  • 配置服务器(Config Server):存储集群元数据(如分片键)。


四、适用场景

  1. 内容管理系统(CMS)

    灵活存储文章、评论、标签等非结构化数据。

  2. 实时分析

    快速插入和查询日志、用户行为数据。

  3. 物联网(IoT)

    高效处理设备生成的海量时序数据。

  4. 移动应用

    支持离线数据同步和复杂查询。


五、快速入门指南

1. 安装 MongoDB
  • 下载地址MongoDB Community Server

  • 启动服务(默认端口 27017):

    bash

    复制代码
    mongod --dbpath=/data/db
2. 基本操作(Mongo Shell)

javascript

复制代码
// 创建/切换数据库
use testdb

// 插入文档
db.users.insertOne({
  name: "Bob",
  age: 25,
  email: "[email protected]"
})

// 查询文档
db.users.find({ age: { $gt: 20 } })  // 年龄大于20的用户

// 更新文档
db.users.updateOne(
  { name: "Bob" },
  { $set: { age: 26 } }
)

// 删除文档
db.users.deleteOne({ name: "Bob" })
3. 索引优化

javascript

复制代码
// 创建索引
db.users.createIndex({ email: 1 })  // 1表示升序,-1表示降序

// 查看索引
db.users.getIndexes()
4. 聚合管道(Aggregation)

统计每个城市的用户数量:

javascript

复制代码
db.users.aggregate([
  { $group: { _id: "$address.city", total: { $sum: 1 } } }
])
5. Node.js 示例

安装驱动:npm install mongodb

复制代码
const { MongoClient } = require("mongodb");
const uri = "mongodb://localhost:27017";

async function main() {
  const client = new MongoClient(uri);
  await client.connect();
  
  const db = client.db("testdb");
  const collection = db.collection("users");
  
  // 插入文档
  await collection.insertOne({ name: "Charlie", age: 28 });
  
  // 查询文档
  const users = await collection.find({ age: { $lt: 30 } }).toArray();
  console.log(users);
  
  await client.close();
}

main();
相关推荐
观无4 分钟前
基于AOP+Log4Net+AutoFac日志框架
java·大数据·数据库
Java中文社群14 分钟前
SpringAI版本更新:向量数据库不可用的解决方案!
java·人工智能·后端
王磊鑫27 分钟前
重返JAVA之路——图书管理系统
java·开发语言
听闻风很好吃30 分钟前
Java设计模式之观察者模式:从入门到架构级实践
java·观察者模式·设计模式
艺杯羹33 分钟前
JDBC 初认识、速了解
java·数据库·jdbc
陵易居士34 分钟前
Spring如何解决项目中的循环依赖问题?
java·后端·spring
铁弹神侯41 分钟前
Maven相关名词及相关配置
java·maven
会飞的皮卡丘EI1 小时前
关于Blade框架对数字类型的null值转为-1问题
java·spring boot
雷渊1 小时前
如何保证数据库和Es的数据一致性?
java·后端·面试
fjkxyl1 小时前
Spring的启动流程
java·后端·spring