mongodb基础

MongoDB 是一款开源的 ​文档型数据库,属于 NoSQL 数据库家族。它以其灵活的数据模型、高性能和易扩展性著称,广泛应用于大数据、实时分析、内容管理等领域。

特性 MongoDB Database SQL Database
Schema 无预定义 Schema 需预先定义表结构
数据类型 支持嵌套文档、数组 严格遵循 SQL 数据类型
扩展性 动态字段,灵活扩展 需修改表结构(ALTER)
特性 MongoDB Collection SQL Table
Schema 动态 Schema 固定 Schema
数据类型 BSON(支持嵌套、数组) 标准 SQL 类型
扩展性 支持水平分片 需垂直扩展(增大单表)
事务 支持多文档 ACID 事务 支持 SQL 事务
特性 MongoDB Document SQL Row
结构 动态字段,可嵌套 固定列,无嵌套
扩展性 灵活添加/删除字段 需修改表结构
查询复杂度 支持聚合、全文搜索 依赖 SQL 查询

安装和使用

MongoDB下载

​编辑

将压缩包解压到一个目录中

在解压目录中,手动创建一个目录用于存放数据文件,如 data/db

启动

在bin目录中打开命令行提示符,输入如下命令:

ini 复制代码
mongod --dbpath=..\data\db

为了方便下次启动。

在桌面上新建一个 启动mongo.bat

在里面写一行启动命令,D:\mongodb\bin\mongod.exe --dbpath=D:\mongodb\data\db

以后直接双击这个文件就可以启动mongodb服务

下载客户端工具

MongoDB Shell Download | MongoDB

点击add new connection。在对话框中直接点击链接。

打开open MongoDB shell

mongodb命令

show dbs 的基本用法

1. ​语法

ini 复制代码
show dbs;

2. ​作用

  • 列出所有数据库名称,无论是否包含数据。
  • 包括系统数据库 (如 adminlocal、config)和用户自定义数据库。

3. ​示例输出

lua 复制代码
admin      0.00GB
local      0.00GB
mydb       1.20GB
config     0.00GB

系统数据库说明

MongoDB 默认创建以下系统数据库:

数据库名 作用 内容示例
admin 管理员权限数据库,存储用户和角色信息。 用户凭证、角色权限配置。
local 存储本地实例的元数据和配置文件。 分片集群配置、备份信息。
config 分片集群配置信息 shards、databases

数据库操作

  • 创建数据库

    perl 复制代码
    use mydb; // 切换到数据库(自动创建)
    db.createDatabase("mydb"); // 显式创建(可选)
  • 删除数据库

    bash 复制代码
    db.dropDatabase("mydb");
    
    # 不带参数,直接删除自己所在数据库
    # db.dropDatabase();
  • 切换数据库

perl 复制代码
  use mydb
  • 查看当前所在数据库

复制代码
    db

集合基础操作

一、创建集合

scss 复制代码
#显式创建:使用 createCollection() 
db.createCollection("users") 
// 创建固定大小集合
php 复制代码
# 隐式创建:插入文档时自动生成集合(推荐动态场景)。
db.products.insertOne({ name: "Laptop", price: 1200 }) 
// 自动创建 products 集合
bash 复制代码
# 重命名集合
db.products.renameCollection("orders");
  • 显示当前数据库中的所有集合

    sql 复制代码
    show collections
  • 删除集合

  • 使用 drop() 彻底删除集合及数据:

    scss 复制代码
    db.orders.drop() // 删除 orders 集合

二、数据增删改

  1. 插入文档

    • 单条插入insertOne()insert()

      php 复制代码
      db.users.insertOne({ name: "Alice", age: 28, tags: ["admin", "dev"] })

      insertMany() 调用默认是无序的(即文档插入顺序可能与数组顺序不一致)

    • 批量插入insertMany() 支持有序/无序插入(ordered: true/false

      php 复制代码
      db.books.insertMany([ { title: "MongoDB Guide", price: 45 },
       { title: "Python Basics", price: 30 } ], 
      { ordered: false })

设置 ordered: true 时,MongoDB 会按数组顺序依次插入文档。

版本要求 :​MongoDB 4.2+

性能注意:有序插入会增加写操作的复杂度,可能影响吞吐量。

  1. 更新文档

    • 替换更新replaceOne() 替换整个文档:

      php 复制代码
      db.users.replaceOne({ name: "Alice" }, 
      { name: "Alice", role: "manager" })
    • 字段更新updateOne()/updateMany() 使用 $set 修改部分字段:

      css 复制代码
      db.products.updateMany( { price: { $lt: 50 } }, 
      { $set: { discount: 0.1 } } // 为低价商品添加折扣 )
  2. 删除文档 deleteOne()deleteMany()

    kotlin 复制代码
      // 删除所有年龄大于50的用户
      db.users.deleteMany({ "age": { "$gt": 50 } });
    json 复制代码
      // 删除年龄为30的用户
      db.users.deleteOne({ "age": 30 });

三、查询与聚合

  1. 基础查询

    • 全量查询find() 返回游标对象,可链式调用 .pretty() 格式化输出

      scss 复制代码
      db.orders.find().pretty() // 查询前10条订单
    • 条件查询 :支持等值、范围($gt, $lt)、逻辑符($and, $or

      css 复制代码
      db.users.find({ age: { $gte: 18 }, city: "Beijing" })
  2. 高级查询

    • 正则匹配$regex 实现模糊搜索(如用户名前缀)

      javascript 复制代码
      db.products.find({ name: { $regex: /^Apple/ } }) // 查找以 Apple 开头的商品
    • 数组查询$in 匹配数组元素,$size 筛选数组长度:

      复制代码
      css 复制代码
      db.articles.find({ tags: { $in: ["tech", "AI"] } })
  3. 聚合管道

    • 统计与分组 :使用 $group, $sum, $avg 等操作符:

      复制代码
      php 复制代码
      db.sales.aggregate([ { $group: 
            { _id: "$category", total: { $sum: "$amount" } } } ])
       // 按分类统计销售额

四、索引与性能优化

  1. 索引管理

    • 创建索引createIndex() 加速查询(单字段、复合、文本索引):

      复制代码
      php 复制代码
      db.users.createIndex({ email: 1 }, { unique: true })
       // 唯一索引
    • 查看索引getIndexes() 显示集合索引信息:

      复制代码
      scss 复制代码
      db.products.getIndexes() // 输出所有索引结构
  2. 性能监控

    • 使用 explain() 分析查询执行计划:

      复制代码
      lua 复制代码
      db.orders.find({ status: "shipped" }).explain("executionStats")

五、高级操作

  1. 分页与排序

    • 分页limit()skip() 实现数据分段:

      复制代码
      scss 复制代码
      db.comments.find().skip(20).limit(10) // 第3页数据(每页10条)
    • 排序sort() 按指定字段排序:

      复制代码
      scss 复制代码
      db.products.find().sort({ price: -1 }) // 价格降序
  2. 事务支持(v4.0+)

    • 多文档事务需在副本集或分片集群中使用:

      复制代码
      php 复制代码
      const session = db.getMongo().startSession();
      session.startTransaction(); 
      try { 
          db.accounts.updateOne({ _id: 1 }, { $inc: { balance: -100 } }); 
          db.accounts.updateOne({ _id: 2 }, { $inc: { balance: 100 } });         
          session.commitTransaction(); 
      } catch (error) { 
          session.abortTransaction(); 
      }

六、注意事项

  • 数据安全 :生产环境避免直接操作 adminlocal 等系统集合。
  • 索引优化 :为高频查询字段(如 _id、用户名、邮箱)创建索引,聚合查询中的 groupsortmatch 字段必须索引
  • 避免冗余索引: 索引过多会占用内存并降低写性能,建议通过 db.collection.getIndexes() 定期清理。
  • 查询优化:避免全集合扫描。
  • 文档结构优化:避免过度嵌套文档,超过 3-4 层,需合理设计数据结构。

生产环境强制启用加密和认证。

不适用场景:强事务性系统、高度关系型数据。

相关推荐
HyggeBest8 分钟前
Golang 并发原语 Sync Cond
后端·架构·go
mao毛3 小时前
Go 1.25 重磅发布:性能飞跃、工具升级与新一代 GC 来袭
后端·go
鼠鼠我捏,要死了捏5 小时前
生产环境MongoDB分片策略优化与故障排查实战经验分享
数据库·mongodb·分片
程序员爱钓鱼8 小时前
Go语言实战案例-使用SQLite实现本地存储
后端·google·go
江湖十年8 小时前
Go 1.25 终于迎来了容器感知 GOMAXPROCS
后端·面试·go
岁忧17 小时前
(nice!!!)(LeetCode 每日一题) 679. 24 点游戏 (深度优先搜索)
java·c++·leetcode·游戏·go·深度优先
清风6666661 天前
基于51单片机自动浇花1602液晶显示设计
单片机·嵌入式硬件·mongodb·毕业设计·51单片机·课程设计
大新屋1 天前
MongoDB 分片集群修改管理员密码
数据库·mongodb
foundbug9991 天前
Node.js导入MongoDB具体操作
数据库·mongodb·node.js