MongoDB 作为 NoSQL 文档型数据库的代表,以其自由的文档模型、强大的扩展能力和灵活的查询语法,成为互联网时代处理多变数据、海量数据的首选工具。本文将从部署开始,详细解析 MongoDB 的核心操作、进阶功能及安全控制,帮助你全面掌握这一 “数据抽屉柜” 的使用技巧~
下载安装
D:\MongoDB
),并勾选 “Add MongoDB to the system PATH”。启动服务
mongod --dbpath D:\mongodb\data --port 27017
mongod --dbpath D:\mongodb\data --logpath D:\mongodb\log\mongod.log --install --serviceName "MongoDB"
net start MongoDB
添加软件源与安装
wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -
echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
sudo apt-get update && sudo apt-get install -y mongodb-org
服务管理
sudo systemctl start mongod # 启动服务
sudo systemctl enable mongod # 设置开机自启
sudo systemctl status mongod # 检查状态
brew tap mongodb/brew
brew install [email protected]
brew services start [email protected] # 启动服务
# 拉取镜像
docker pull mongo:6.0
# 启动容器(映射端口27017,挂载数据卷)
docker run -d --name my-mongo -p 27017:27017 -v /local/mongodb/data:/data/db mongo:6.0
方法 | 说明 | 示例 | emoji |
---|---|---|---|
insertOne() |
插入单个文档 | db.users.insertOne({ name: "John", age: 30 }) |
单份放 |
insertMany() |
插入多个文档 | db.users.insertMany([{ name: "Alice" }, { name: "Bob" }]) |
批量塞 |
1. 基础查询
db.users.find(); // 查询所有文档
db.users.find({ age: { $gt: 25 } }); // 条件查询(年龄>25)
db.users.find({}, { name: 1, age: 1 }); // 投影查询(只显示name和age)
2. 高级查询
$and
、$or
db.users.find({ $or: [{ city: "New York" }, { age: { $lt: 30 } }] });
$regex
db.users.find({ name: { $regex: "^J" } }); // 姓名以J开头
方法 | 说明 | 示例 | emoji |
---|---|---|---|
updateOne() |
更新单个文档 | db.users.updateOne({ name: "John" }, { $set: { age: 31 } }) |
✏️ 改单份 |
updateMany() |
批量更新文档 | db.users.updateMany({ city: "New York" }, { $inc: { age: 1 } }) |
✏️✏️ 批量改 |
upsert | 不存在则插入 | db.users.updateOne({ name: "Tom" }, { $set: { age: 28 } }, { upsert: true }) |
✨ 智能改 |
方法 | 说明 | 示例 | emoji |
---|---|---|---|
deleteOne() |
删除单个文档 | db.users.deleteOne({ name: "John" }) |
️ 扔单份 |
deleteMany() |
批量删除文档 | db.users.deleteMany({ age: { $gt: 35 } }) |
️️ 批量扔 |
drop() |
删除整个集合 | db.users.drop(); |
️ 删抽屉 |
use mydb; // 切换/创建数据库(插入数据时自动创建)
show dbs; // 查看所有数据库
db.dropDatabase(); // 删除当前数据库
db.createCollection("users"); // 显式创建集合(可选,插入时会自动创建)
show collections; // 查看当前数据库所有集合
db.users.drop(); // 删除集合
聚合管道通过多个阶段处理数据,类似 “流水线加工”:
// 按城市分组,统计用户数和平均年龄
db.users.aggregate([
{ $match: { age: { $gt: 20 } } }, // 筛选年龄>20
{ $group: {
_id: "$city", // 分组字段
count: { $sum: 1 }, // 统计数量
avgAge: { $avg: "$age" } // 计算平均值
}}
]);
核心阶段:$match
(筛选)→ $group
(分组)→ $project
(投影)→ $sort
(排序)。
索引大幅提升查询效率,避免全表
// 单字段索引(升序)
db.users.createIndex({ name: 1 });
// 复合索引(城市升序+年龄降序)
db.users.createIndex({ city: 1, age: -1 });
// 唯一索引(防止重复数据)
db.users.createIndex({ email: 1 }, { unique: true });
// 查看/删除索引
db.users.getIndexes();
db.users.dropIndex({ name: 1 });
创建管理员用户(非认证模式下):
use admin
db.createUser({
user: "admin",
pwd: "securepass",
roles: [ { role: "root", db: "admin" } ] // 最高权限
});
修改配置文件
在mongod.conf
中添加:
security:
authorization: enabled
重启服务后生效。use testdb
// 创建只读用户
db.createUser({
user: "readonly",
pwd: "readonly",
roles: [ { role: "read", db: "testdb" } ]
});
// 创建读写用户
db.createUser({
user: "readwrite",
pwd: "readwrite",
roles: [ { role: "readWrite", db: "testdb" } ]
});
{
name: "John",
address: { city: "New York", street: "5th Ave" },
hobbies: ["篮球", "电影"]
}
user_id
、email
)创建索引,用db.users.find().explain("executionStats")
分析查询性能。insertMany()
、updateMany()
替代循环单条操作,减少网络开销。mongodump
命令,例如: mongodump -d testdb -o D:\backup\testdb
mongorestore
命令: mongorestore -d testdb D:\backup\testdb\testdb
问题 | 原因 | 解决方法 |
---|---|---|
E11000 重复键错误 |
唯一索引冲突 | createIndex({ field: 1 }, { unique: true }) |
查询慢 | 未使用索引或全表扫描 | 为查询字段创建索引,分析查询计划(explain() ) |
权限不足 | 用户无对应角色权限 | 用管理员用户登录,分配readWrite 或dbAdmin 角色 |
数据库未创建 | 未插入数据,仅切换数据库 | 向数据库插入数据(db.collection.insertOne() ) |
MongoDB 的魅力在于 “灵活” 与 “高效”,它让数据存储不再受限于固定结构,而是随业务需求自由生长。现在就打开你的 MongoDB “数据抽屉”,开始高效的数据管理之旅吧!
通过以上内容,你将全面掌握 MongoDB 从部署到高级操作的核心技能,无论是小型应用还是大规模分布式系统,都能游刃有余地处理数据~