Skip to content

Node.js 权威指南笔记(二)

数据库访问。

一、MongoDB

1. 概念

MongoDB 是一个基于分布式文件存储的 NoSQL 数据库。它采用了 文档数据库模型,以 JSON 类似的 BSON(Binary JSON)格式存储数据。与传统的关系型数据库(如 MySQL)不同,MongoDB 不使用表和行,而是使用 集合(collection)文档(document) 来组织和存储数据。

  • NoSQL:非关系型数据库,灵活、扩展性强,特别适合大规模数据和分布式应用。
  • 文档数据库:MongoDB 是一种文档数据库,它的每个文档都是一组键值对,非常适合处理半结构化数据。

相关概念

  1. 分布式文件存储:是一种数据存储架构,数据被分散存储在多台服务器上,而不是集中在单一服务器中。它通过将数据拆分并复制到多个节点上,实现高可用性、容错性和扩展性。分布式存储可以提高数据的安全性和访问速度,并且非常适合处理大规模数据集。特点:数据冗余、容错、可扩展、提高存储效率。
  2. 文档数据库模块:是一种非关系型数据库(NoSQL),以 文档 的形式存储数据。每个文档类似于 JSON 对象,由键值对组成,并存储在集合(collection)中。文档数据库允许存储不规则结构的数据,每个文档的字段和字段类型可以不同。特点:灵活的模式、支持嵌套数据、水平扩展方便。
  3. 半结构化数据:是一种介于结构化数据和非结构化数据之间的数据形式,通常没有严格的表格或关系模型,但包含可以识别的数据标记或元数据。常见的格式包括 JSON、XML、HTML 等。半结构化数据比非结构化数据更易于处理,但不如结构化数据那样严格。特点:灵活、不规则、不需要预定义模式。
  4. 关系型数据库:(Relational Database,RDBMS)是一种基于 表 的结构化数据存储系统,数据通过行和列的方式存储,并且通过关系(外键、主键等)进行关联。使用结构化查询语言(SQL)进行数据操作。常见的关系型数据库包括 MySQL、PostgreSQL、Oracle 等。特点:严格的数据结构、数据一致性强、支持事务。
  5. 非关系型数据库:(NoSQL Database)是一类不使用传统关系模型的数据库,通常以键值对、列族、文档或图形的形式存储数据。NoSQL 数据库具有灵活的架构,适用于处理大量数据和高并发访问。常见的 NoSQL 数据库有 MongoDB(文档型)、Redis(键值型)、Cassandra(列族型)等。特点:灵活的数据模式、水平扩展、高性能处理海量数据。 应用场景:大数据分析、社交网络、实时应用、物联网(IoT)数据。

2. 作用和应用场景

作用

MongoDB 提供了高性能、可扩展性和灵活的查询功能,尤其适用于处理大量分布式数据。与传统 SQL 数据库相比,MongoDB 通过以下方式提升数据管理效率:

  • 横向扩展:MongoDB 可以轻松地通过分片(sharding)来实现分布式数据存储和处理。
  • 灵活的数据模式:文档可以存储不规则的数据,支持不同的字段结构。
  • 高吞吐量:适合需要高并发读写的应用。
  • 丰富的查询语言:支持类似 SQL 的查询语言,拥有丰富的聚合功能。

应用场景

  • 内容管理系统(CMS):如博客、新闻网站,数据结构复杂且动态变化。
  • 实时数据处理:如物联网、日志分析等需要处理高吞吐量的应用。
  • 电商平台:管理商品、订单等半结构化数据。
  • 社交媒体应用:MongoDB 可以很好地处理大量用户数据和关系数据。

3. 安装和使用步骤

安装步骤

  1. 下载安装 MongoDB

    • 在 MongoDB 官方网站下载适合你系统的 MongoDB 安装包。
    • 安装完成后,将 MongoDB 的 bin 目录添加到环境变量中。
  2. 启动 MongoDB 服务

    • 使用命令行启动 MongoDB 服务,通常 MongoDB 的默认端口为 27017
    • Windows: 在命令行中输入 mongod 启动 MongoDB 服务。
    • macOS/Linux: 在终端输入 mongod --config /usr/local/etc/mongod.conf(路径可能根据安装情况变化)。
  3. 安装 MongoDB 客户端(Mongo Shell)

    • MongoDB 提供了 mongo 命令行工具,可以通过它连接到 MongoDB 数据库进行操作。

使用步骤

  1. 连接到数据库

    • 打开 MongoDB shell,输入 mongo 命令来连接到本地 MongoDB 服务:
      bash
      mongo
    • MongoDB shell 启动后,可以执行各种数据库操作。
  2. 连接远程数据库

    bash
    mongo <your_host>:<port>
  3. 选择数据库

    bash
    use myDatabase

    如果数据库不存在,会在插入第一条记录时创建该数据库。

4. 增删改查 CRUD 具体代码

1. 创建文档(Insert)

javascript
// 插入单条数据
db.users.insertOne({
  name: 'John Doe',
  age: 30,
  email: 'john.doe@example.com',
})

// 插入多条数据
db.users.insertMany([
  { name: 'Jane Doe', age: 25, email: 'jane.doe@example.com' },
  { name: 'Mark Smith', age: 40, email: 'mark.smith@example.com' },
])

2. 查询文档(Read)

javascript
// 查询所有用户
db.users.find({})

// 查询特定条件的用户
db.users.find({ age: { $gt: 30 } }) // 查询年龄大于30的用户

3. 更新文档(Update)

javascript
// 更新单条数据
db.users.updateOne(
  { name: 'John Doe' }, // 查询条件
  { $set: { age: 31 } } // 更新操作
)

// 更新多条数据
db.users.updateMany(
  { age: { $lt: 30 } }, // 查询条件
  { $set: { status: 'active' } } // 更新操作
)

4. 删除文档(Delete)

javascript
// 删除单条数据
db.users.deleteOne({ name: 'Jane Doe' })

// 删除多条数据
db.users.deleteMany({ age: { $gt: 30 } })

5. 聚合查询

MongoDB 的聚合框架类似 SQL 的 GROUP BY,支持复杂的数据处理和聚合。

javascript
db.orders.aggregate([
  { $match: { status: 'completed' } }, // 筛选已完成订单
  { $group: { _id: '$customerId', totalSpent: { $sum: '$amount' } } }, // 计算每个客户的总消费
  { $sort: { totalSpent: -1 } }, // 按总消费降序排序
])

5. 注意事项

  1. 数据模式设计

    • 虽然 MongoDB 是无模式的数据库,但合理的文档结构设计仍然非常重要。需要平衡嵌套结构的复杂性和性能。
  2. 索引优化

    • 正确地使用索引可以显著提高查询性能。MongoDB 支持多种索引类型,如复合索引、唯一索引等。
  3. 事务支持

    • MongoDB 支持多文档事务,可以在应用需要事务性操作时使用,但要谨慎使用,因为事务可能会带来额外的性能开销。
  4. 分片与复制集

    • 在需要高可用性或横向扩展的场景下,使用 MongoDB 的分片机制(sharding)和复制集(replica set)来实现分布式存储和读写分离。
  5. 内存与磁盘使用

    • MongoDB 将大量的数据存储在内存中,所以在大数据量时,确保服务器有足够的内存。同时,也要注意磁盘 I/O 和存储的压力,选择适合业务需求的存储方案。

通过 MongoDB,开发者可以轻松处理大规模、半结构化数据,并支持灵活的数据存储和查询方式,使其在现代 web 应用和大数据处理中非常流行。

二、MySQL