Node.js 权威指南笔记(二)
数据库访问。
一、MongoDB
1. 概念
MongoDB 是一个基于分布式文件存储的 NoSQL 数据库。它采用了 文档数据库模型,以 JSON 类似的 BSON(Binary JSON)格式存储数据。与传统的关系型数据库(如 MySQL)不同,MongoDB 不使用表和行,而是使用 集合(collection) 和 文档(document) 来组织和存储数据。
- NoSQL:非关系型数据库,灵活、扩展性强,特别适合大规模数据和分布式应用。
- 文档数据库:MongoDB 是一种文档数据库,它的每个文档都是一组键值对,非常适合处理半结构化数据。
相关概念
- 分布式文件存储:是一种数据存储架构,数据被分散存储在多台服务器上,而不是集中在单一服务器中。它通过将数据拆分并复制到多个节点上,实现高可用性、容错性和扩展性。分布式存储可以提高数据的安全性和访问速度,并且非常适合处理大规模数据集。特点:数据冗余、容错、可扩展、提高存储效率。
- 文档数据库模块:是一种非关系型数据库(NoSQL),以 文档 的形式存储数据。每个文档类似于 JSON 对象,由键值对组成,并存储在集合(collection)中。文档数据库允许存储不规则结构的数据,每个文档的字段和字段类型可以不同。特点:灵活的模式、支持嵌套数据、水平扩展方便。
- 半结构化数据:是一种介于结构化数据和非结构化数据之间的数据形式,通常没有严格的表格或关系模型,但包含可以识别的数据标记或元数据。常见的格式包括 JSON、XML、HTML 等。半结构化数据比非结构化数据更易于处理,但不如结构化数据那样严格。特点:灵活、不规则、不需要预定义模式。
- 关系型数据库:(Relational Database,RDBMS)是一种基于 表 的结构化数据存储系统,数据通过行和列的方式存储,并且通过关系(外键、主键等)进行关联。使用结构化查询语言(SQL)进行数据操作。常见的关系型数据库包括 MySQL、PostgreSQL、Oracle 等。特点:严格的数据结构、数据一致性强、支持事务。
- 非关系型数据库:(NoSQL Database)是一类不使用传统关系模型的数据库,通常以键值对、列族、文档或图形的形式存储数据。NoSQL 数据库具有灵活的架构,适用于处理大量数据和高并发访问。常见的 NoSQL 数据库有 MongoDB(文档型)、Redis(键值型)、Cassandra(列族型)等。特点:灵活的数据模式、水平扩展、高性能处理海量数据。 应用场景:大数据分析、社交网络、实时应用、物联网(IoT)数据。
2. 作用和应用场景
作用
MongoDB 提供了高性能、可扩展性和灵活的查询功能,尤其适用于处理大量分布式数据。与传统 SQL 数据库相比,MongoDB 通过以下方式提升数据管理效率:
- 横向扩展:MongoDB 可以轻松地通过分片(sharding)来实现分布式数据存储和处理。
- 灵活的数据模式:文档可以存储不规则的数据,支持不同的字段结构。
- 高吞吐量:适合需要高并发读写的应用。
- 丰富的查询语言:支持类似 SQL 的查询语言,拥有丰富的聚合功能。
应用场景
- 内容管理系统(CMS):如博客、新闻网站,数据结构复杂且动态变化。
- 实时数据处理:如物联网、日志分析等需要处理高吞吐量的应用。
- 电商平台:管理商品、订单等半结构化数据。
- 社交媒体应用:MongoDB 可以很好地处理大量用户数据和关系数据。
3. 安装和使用步骤
安装步骤
下载安装 MongoDB:
- 在 MongoDB 官方网站下载适合你系统的 MongoDB 安装包。
- 安装完成后,将 MongoDB 的 bin 目录添加到环境变量中。
启动 MongoDB 服务:
- 使用命令行启动 MongoDB 服务,通常 MongoDB 的默认端口为
27017
。 - Windows: 在命令行中输入
mongod
启动 MongoDB 服务。 - macOS/Linux: 在终端输入
mongod --config /usr/local/etc/mongod.conf
(路径可能根据安装情况变化)。
- 使用命令行启动 MongoDB 服务,通常 MongoDB 的默认端口为
安装 MongoDB 客户端(Mongo Shell):
- MongoDB 提供了
mongo
命令行工具,可以通过它连接到 MongoDB 数据库进行操作。
- MongoDB 提供了
使用步骤
连接到数据库:
- 打开 MongoDB shell,输入
mongo
命令来连接到本地 MongoDB 服务:bashmongo
- MongoDB shell 启动后,可以执行各种数据库操作。
- 打开 MongoDB shell,输入
连接远程数据库:
bashmongo <your_host>:<port>
选择数据库:
bashuse 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. 注意事项
数据模式设计:
- 虽然 MongoDB 是无模式的数据库,但合理的文档结构设计仍然非常重要。需要平衡嵌套结构的复杂性和性能。
索引优化:
- 正确地使用索引可以显著提高查询性能。MongoDB 支持多种索引类型,如复合索引、唯一索引等。
事务支持:
- MongoDB 支持多文档事务,可以在应用需要事务性操作时使用,但要谨慎使用,因为事务可能会带来额外的性能开销。
分片与复制集:
- 在需要高可用性或横向扩展的场景下,使用 MongoDB 的分片机制(sharding)和复制集(replica set)来实现分布式存储和读写分离。
内存与磁盘使用:
- MongoDB 将大量的数据存储在内存中,所以在大数据量时,确保服务器有足够的内存。同时,也要注意磁盘 I/O 和存储的压力,选择适合业务需求的存储方案。
通过 MongoDB,开发者可以轻松处理大规模、半结构化数据,并支持灵活的数据存储和查询方式,使其在现代 web 应用和大数据处理中非常流行。