mongodb基础

218 阅读5分钟

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

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

安装和使用

MongoDB下载

​编辑

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

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

启动

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

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. ​语法

show dbs;

2. ​作用

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

3. ​示例输出

admin      0.00GB
local      0.00GB
mydb       1.20GB
config     0.00GB


系统数据库说明

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

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

数据库操作

  • 创建数据库

    use mydb; // 切换到数据库(自动创建)
    db.createDatabase("mydb"); // 显式创建(可选)
    

  • 删除数据库

    db.dropDatabase("mydb");
    
    # 不带参数,直接删除自己所在数据库
    # db.dropDatabase();
    

  • 切换数据库:  

  •   use mydb
    

  •  ​查看当前所在数据库

  •   db
    

集合基础操作

一、创建集合

#显式创建:使用 createCollection() 
db.createCollection("users") 
// 创建固定大小集合

# 隐式创建:插入文档时自动生成集合(推荐动态场景)。
db.products.insertOne({ name: "Laptop", price: 1200 }) 
// 自动创建 products 集合

# 重命名集合
db.products.renameCollection("orders");

  • 显示当前数据库中的所有集合

    show collections
    

  •  删除集合

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

    db.orders.drop() // 删除 orders 集合
    


二、数据增删改

  1. 插入文档

    • 单条插入insertOne() 或 insert()

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

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

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

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

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

                        ​版本要求:​MongoDB 4.2+

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

  1. 更新文档

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

      db.users.replaceOne({ name: "Alice" }, 
      { name: "Alice", role: "manager" })
      

    • 字段更新updateOne()/updateMany() 使用 $set 修改部分字段:

      db.products.updateMany( { price: { $lt: 50 } }, 
      { $set: { discount: 0.1 } } // 为低价商品添加折扣 )
      

  2. 删除文档deleteOne() 或 deleteMany()

    •   // 删除所有年龄大于50的用户
        db.users.deleteMany({ "age": { "$gt": 50 } });
      

    •   // 删除年龄为30的用户
        db.users.deleteOne({ "age": 30 });
      


三、查询与聚合

  1. 基础查询

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

      db.orders.find().pretty() // 查询前10条订单
      

    • 条件查询:支持等值、范围($gt$lt)、逻辑符($and$or

      db.users.find({ age: { $gte: 18 }, city: "Beijing" })
      

  2. 高级查询

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

      db.products.find({ name: { $regex: /^Apple/ } }) // 查找以 Apple 开头的商品
      

    • 数组查询$in 匹配数组元素,$size 筛选数组长度:

      db.articles.find({ tags: { $in: ["tech", "AI"] } })
      

  3. 聚合管道

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

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


四、索引与性能优化

  1. 索引管理

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

      db.users.createIndex({ email: 1 }, { unique: true })
       // 唯一索引
      

    • 查看索引getIndexes() 显示集合索引信息:

      db.products.getIndexes() // 输出所有索引结构
      

  2. 性能监控

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

      db.orders.find({ status: "shipped" }).explain("executionStats")
      


五、高级操作

  1. 分页与排序

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

      db.comments.find().skip(20).limit(10) // 第3页数据(每页10条)
      

    • 排序sort() 按指定字段排序:

      db.products.find().sort({ price: -1 }) // 价格降序
      

  2. 事务支持(v4.0+)

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

      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 层,需合理设计数据结构。

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

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