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 层,需合理设计数据结构。
生产环境强制启用加密和认证。
不适用场景:强事务性系统、高度关系型数据。