文档数据库(MongoDB)

应用分类:

MongoDB 是一款流行的开源文档数据库,以其灵活的模式、高可伸缩性和易用性而广泛应用于现代 Web 应用和大数据场景。

原价为:1.00¥。当前价格为:0.00¥。

文档数据库 MongoDB 介绍

一、MongoDB 主要特点及核心功能

MongoDB 是一款流行的开源文档数据库,属于 NoSQL (Not Only SQL) 数据库的范畴。它以其灵活的数据模型、高可伸缩性、高性能和易用性而广泛应用于现代 Web 应用、大数据处理、移动应用后端等场景。

主要特点:

  • 文档数据模型: MongoDB 将数据存储在灵活的、类似 JSON 的文档中,称为 BSON (Binary JSON)。这种模型允许嵌入式文档和数组,使得表示复杂关联数据更加自然,减少了传统关系型数据库中多表连接的需求。
  • 动态模式: 与关系型数据库需要预先定义表结构不同,MongoDB 的集合 (相当于关系型数据库的表) 中的文档可以拥有不同的字段和结构。这为快速迭代和灵活的数据管理提供了便利。
  • 高可伸缩性: MongoDB 支持水平扩展,可以通过分片 (Sharding) 将数据分布在多个服务器上,实现存储容量和写入性能的线性增长。
  • 高可用性: MongoDB 通过副本集 (Replica Sets) 实现高可用性。副本集是一组 MongoDB 服务器,其中一个为主节点 (Primary),负责处理所有写入操作,其他的为从节点 (Secondary),复制主节点的数据。当主节点发生故障时,可以自动选举出一个新的主节点。
  • 丰富的查询语言: MongoDB 提供了强大的查询语言,支持各种查询操作,包括字段选择、条件过滤、排序、聚合、地理空间查询、全文搜索等。
  • 高性能: MongoDB 针对读写操作进行了优化,支持索引 (包括各种类型的索引,如 B-tree 索引、地理空间索引、文本索引等),能够高效地查询和更新数据。
  • 自动故障转移: 在副本集中,当主节点不可用时,MongoDB 会自动进行故障转移,选举出一个新的主节点,保证系统的持续可用性。
  • 易于开发和管理: MongoDB 的文档数据模型与现代编程语言中的对象和数据结构非常相似,降低了开发门槛。同时,MongoDB 提供了易于使用的命令行工具和图形化管理工具。
  • 多种存储引擎: MongoDB 支持多种存储引擎,包括 WiredTiger (默认引擎,提供良好的读写性能和并发控制) 和 MMAPv1 (较早的版本)。

核心功能:

  • 文档存储: 以灵活的文档格式存储数据。
  • CRUD 操作: 支持创建 (Create)、读取 (Read)、更新 (Update)、删除 (Delete) 数据操作。
  • 索引: 支持各种类型的索引以加速数据查询。
  • 聚合框架: 提供强大的数据聚合管道,用于数据分析和报表生成。
  • 复制: 通过副本集实现数据冗余和高可用性。
  • 分片: 通过分片实现水平扩展。
  • 事务支持: 支持多文档的原子事务 (在 4.0 版本后引入)。

二、基础使用流程

本部分描述在 MongoDB 服务已经成功运行并可以访问的前提下,用户进行基本数据库操作的流程。

  1. 连接到 MongoDB 服务器: 使用 MongoDB 提供的命令行客户端 mongo 连接到服务器。默认情况下,它会连接到本地运行的 MongoDB 实例。

    mongo
    

    要连接到特定的主机和端口,可以使用 --host--port 参数:

    mongo --host <服务器地址> --port <端口号>
    

    如果需要认证,可以使用 --username--password 参数或在连接后使用 db.auth() 命令。

  2. 切换/创建数据库: 使用 use 命令切换到指定的数据库。如果该数据库不存在,在首次插入数据时会自动创建。

    use mydatabase
    
  3. 插入文档: 使用 insertOne()insertMany() 方法向集合 (Collection,相当于关系型数据库的表) 中插入一个或多个文档。

    db.users.insertOne({ username: "john_doe", email: "john.doe@example.com", age: 30 })
    db.products.insertMany([
      { name: "Laptop", price: 1200, quantity: 10 },
      { name: "Mouse", price: 25, quantity: 50 }
    ])
    
  4. 查询文档: 使用 find() 方法查询集合中的文档。可以传入查询条件文档来过滤结果。

    db.users.find() // 查询 users 集合中的所有文档
    db.users.find({ age: { $gt: 25 } }) // 查询 age 大于 25 的用户
    db.products.find({ price: { $lt: 100 }, quantity: { $gt: 20 } }) // 查询价格小于 100 且数量大于 20 的产品
    db.users.findOne({ username: "john_doe" }) // 查询第一个匹配的用户
    
  5. 更新文档: 使用 updateOne()updateMany()replaceOne() 方法更新集合中的文档。需要指定查询条件和更新操作符 ($set, $inc, $push 等)。

    db.users.updateOne({ username: "john_doe" }, { $set: { email: "john.new@example.com" } }) // 更新 john_doe 的邮箱
    db.products.updateMany({ quantity: { $lt: 10 } }, { $inc: { quantity: 5 } }) // 将库存小于 10 的产品数量增加 5
    db.users.replaceOne({ username: "jane_doe" }, { username: "jane", email: "jane@example.com", active: true }) // 替换 jane_doe 的文档
    
  6. 删除文档: 使用 deleteOne()deleteMany() 方法删除集合中的文档。需要指定删除条件。

    db.products.deleteOne({ name: "Mouse" }) // 删除第一个名为 "Mouse" 的产品
    db.users.deleteMany({ age: { $gt: 60 } }) // 删除所有年龄大于 60 的用户
    
  7. 创建索引: 使用 createIndex() 方法在集合的字段上创建索引,以提高查询性能。

    db.users.createIndex({ username: 1 }, { unique: true }) // 在 username 字段上创建唯一索引
    db.products.createIndex({ name: "text" }) // 在 name 字段上创建文本索引
    
  8. 使用聚合管道: 使用 aggregate() 方法执行复杂的数据聚合操作。聚合管道由多个阶段组成,每个阶段对文档进行转换。

    db.products.aggregate([
      { $group: { _id: null, totalValue: { $sum: { $multiply: [ "$price", "$quantity" ] } } } }
    ]) // 计算所有产品的总价值
    
  9. 关闭连接 (退出 mongo 客户端):mongo 客户端中,可以使用 quit()exit 命令退出。

    quit()
    

三、简单使用实例

假设我们已经连接到名为 mydatabase 的 MongoDB 数据库。

  1. 插入一些用户数据到 users 集合:

    db.users.insertMany([
      { username: "alice", email: "alice@example.com", age: 25 },
      { username: "bob", email: "bob@example.com", age: 35 },
      { username: "charlie", email: "charlie@example.com", age: 25 }
    ])
    
  2. 查询所有年龄为 25 的用户:

    db.users.find({ age: 25 })
    

    预期输出 (类似):

    [
      { "_id" : ObjectId("..."), "username" : "alice", "email" : "alice@example.com", "age" : 25 },
      { "_id" : ObjectId("..."), "username" : "charlie", "email" : "charlie@example.com", "age" : 25 }
    ]
    
  3. 将用户 “bob” 的年龄增加 1:

    db.users.updateOne({ username: "bob" }, { $inc: { age: 1 } })
    
  4. 查询更新后 “bob” 的信息:

    db.users.findOne({ username: "bob" })
    

    预期输出 (类似):

    { "_id" : ObjectId("..."), "username" : "bob", "email" : "bob@example.com", "age" : 36 }
    
  5. 删除用户 “charlie”:

    db.users.deleteOne({ username: "charlie" })
    
  6. 查询 users 集合中的所有用户,验证 “charlie” 是否已被删除:

    db.users.find()
    

    预期输出 (类似):

    [
      { "_id" : ObjectId("..."), "username" : "alice", "email" : "alice@example.com", "age" : 25 },
      { "_id" : ObjectId("..."), "username" : "bob", "email" : "bob@example.com", "age" : 36 }
    ]