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. ​作用

  • 列出所有数据库名称,无论是否包含数据。
  • 包括系统数据库 (如 admin、local、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(); 
      }

六、注意事项

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

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

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

​

相关推荐
tachibana214 小时前
使用for range 的时候,它的地址会发生变化吗?
开发语言·后端·golang·go·语法
newerp17 小时前
GC Pacer 调优算法:GOGC、GOMEMLIMIT 与容器 OOM 防御
后端·程序员·go
newerp17 小时前
逃逸分析、栈分配与 sync.Pool 对象池
后端·程序员·go
ly76892 天前
MongoDB 副本集选举风暴排查:从心跳超时到 Journal 刷盘阻塞
数据库·mongodb·php·mongodb 副本集·选举风暴·journal 刷盘·writeconcern
Laurie三省2 天前
现场版却配上录音室版的歌词?聊聊我给开源 Mac 歌词软件写的多源打分算法
算法·macos·go
newerp3 天前
Execution Trace 深入实战:可视化调度与系统停顿分析
后端·程序员·go
newerp3 天前
Go 性能分析工具 pprof:CPU、Heap 与 Goroutine 实战
后端·程序员·go
用户125758524363 天前
Golang后台管理框架推荐:完整后台、Admin Panel、CRUD生成器如何选?
go
皓月盈江3 天前
Go读写TXT文件
开发语言·后端·golang·go·读写txt文件·bufio·go读写txt
SL-staff3 天前
技术实践:将Excel自动升级为可搜索的知识节点(JVS平台实现)
mongodb·elasticsearch·知识图谱·jvs平台·语义解析·企业文档管理·excel结构化