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 查询 |
安装和使用
编辑
将压缩包解压到一个目录中
在解压目录中,手动创建一个目录用于存放数据文件,如 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 |
数据库操作
-
创建数据库:
perluse mydb; // 切换到数据库(自动创建) db.createDatabase("mydb"); // 显式创建(可选) -
删除数据库:
bashdb.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");
-
显示当前数据库中的所有集合
sqlshow collections -
删除集合
-
使用
drop()彻底删除集合及数据:scssdb.orders.drop() // 删除 orders 集合
二、数据增删改
-
插入文档
-
单条插入 :
insertOne()或insert()phpdb.users.insertOne({ name: "Alice", age: 28, tags: ["admin", "dev"] })insertMany()调用默认是无序的(即文档插入顺序可能与数组顺序不一致) -
批量插入 :
insertMany()支持有序/无序插入(ordered: true/false)phpdb.books.insertMany([ { title: "MongoDB Guide", price: 45 }, { title: "Python Basics", price: 30 } ], { ordered: false })
-
设置 ordered: true 时,MongoDB 会按数组顺序依次插入文档。
版本要求 :MongoDB 4.2+ 。
性能注意:有序插入会增加写操作的复杂度,可能影响吞吐量。
-
更新文档
-
替换更新 :
replaceOne()替换整个文档:phpdb.users.replaceOne({ name: "Alice" }, { name: "Alice", role: "manager" }) -
字段更新 :
updateOne()/updateMany()使用$set修改部分字段:cssdb.products.updateMany( { price: { $lt: 50 } }, { $set: { discount: 0.1 } } // 为低价商品添加折扣 )
-
-
删除文档
deleteOne()或deleteMany()kotlin// 删除所有年龄大于50的用户 db.users.deleteMany({ "age": { "$gt": 50 } });json// 删除年龄为30的用户 db.users.deleteOne({ "age": 30 });
三、查询与聚合
-
基础查询
-
全量查询 :
find()返回游标对象,可链式调用.pretty()格式化输出scssdb.orders.find().pretty() // 查询前10条订单 -
条件查询 :支持等值、范围(
$gt,$lt)、逻辑符($and,$or)cssdb.users.find({ age: { $gte: 18 }, city: "Beijing" })
-
-
高级查询
-
正则匹配 :
$regex实现模糊搜索(如用户名前缀)javascriptdb.products.find({ name: { $regex: /^Apple/ } }) // 查找以 Apple 开头的商品 -
数组查询 :
$in匹配数组元素,$size筛选数组长度:cssdb.articles.find({ tags: { $in: ["tech", "AI"] } })
-
-
聚合管道
-
统计与分组 :使用
$group,$sum,$avg等操作符:phpdb.sales.aggregate([ { $group: { _id: "$category", total: { $sum: "$amount" } } } ]) // 按分类统计销售额
-
四、索引与性能优化
-
索引管理
-
创建索引 :
createIndex()加速查询(单字段、复合、文本索引):phpdb.users.createIndex({ email: 1 }, { unique: true }) // 唯一索引 -
查看索引 :
getIndexes()显示集合索引信息:scssdb.products.getIndexes() // 输出所有索引结构
-
-
性能监控
-
使用
explain()分析查询执行计划:luadb.orders.find({ status: "shipped" }).explain("executionStats")
-
五、高级操作
-
分页与排序
-
分页 :
limit()和skip()实现数据分段:scssdb.comments.find().skip(20).limit(10) // 第3页数据(每页10条) -
排序 :
sort()按指定字段排序:scssdb.products.find().sort({ price: -1 }) // 价格降序
-
-
事务支持(v4.0+)
-
多文档事务需在副本集或分片集群中使用:
phpconst 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 层,需合理设计数据结构。
生产环境强制启用加密和认证。
不适用场景:强事务性系统、高度关系型数据。