简介:本文详细介绍MongoDB数据库的基本使用方法,涵盖安装配置、集合文档操作、索引优化、聚合查询及备份恢复等核心功能,帮助开发者快速掌握非关系型数据库的核心技能。
MongoDB 作为文档型非关系型数据库,采用 BSON 格式存储数据,其核心概念包括数据库(Database)、集合(Collection)和文档(Document)。与传统关系型数据库不同,MongoDB 的集合无需预先定义结构,支持动态扩展字段,这种灵活性使其在处理半结构化数据时具有显著优势。
Windows 环境:从 MongoDB 官网下载 MSI 安装包,安装时勾选 “Install MongoDB as a Service” 选项可自动配置为系统服务。安装完成后需手动创建数据目录(如 C:\data\db),通过命令行 mongod --dbpath=C:\data\db 启动服务。
Linux 环境:推荐使用包管理器安装(如 Ubuntu 的 sudo apt-get install mongodb),或通过官方仓库安装最新版本。启动命令为 sudo systemctl start mongod,配置文件通常位于 /etc/mongod.conf。
Docker 部署:使用 docker run -d --name mongo -p 27017:27017 mongo 可快速启动容器,添加 --auth 参数启用认证,或通过 -v 挂载数据卷实现持久化存储。
通过 MongoDB Shell 连接时,使用 mongo --host <ip> --port <port> 命令。若启用认证,需先创建管理员用户:
use admindb.createUser({user: "admin",pwd: "password",roles: ["root"]})
后续连接需添加 -u 和 -p 参数,或在连接字符串中指定:mongodb://admin:password@localhost:27017。
集合创建隐式完成,首次插入文档时自动生成。显式创建集合可指定验证规则:
db.createCollection("users", {validator: {$jsonSchema: {bsonType: "object",required: ["name", "age"],properties: {name: { bsonType: "string" },age: { bsonType: "int", minimum: 0 }}}}})
插入文档:
db.users.insertOne({name: "Alice",age: 28,hobbies: ["reading", "hiking"],createdAt: new Date()})// 批量插入db.users.insertMany([{ name: "Bob", age: 32 },{ name: "Charlie", age: 25 }])
查询文档:
// 条件查询db.users.find({ age: { $gt: 25 } })// 逻辑组合db.users.find({$or: [{ age: { $lt: 20 } }, { name: /^C/ }]})// 投影(字段筛选)db.users.find({}, { name: 1, _id: 0 })
更新文档:
// 替换整个文档db.users.updateOne({ name: "Alice" },{ $set: { age: 29, status: "active" } })// 数组操作db.users.updateOne({ name: "Bob" },{ $push: { hobbies: "swimming" } })
删除文档:
db.users.deleteOne({ name: "Charlie" })db.users.deleteMany({ status: "inactive" })
单字段索引:
db.users.createIndex({ name: 1 }) // 1表示升序,-1表示降序
复合索引:
db.users.createIndex({ age: 1, name: -1 })
多键索引(适用于数组字段):
db.users.createIndex({ hobbies: 1 })
查看索引:
db.users.getIndexes()
删除索引:
db.users.dropIndex("name_1")
使用 explain() 分析查询性能:
db.users.find({ age: { $gt: 25 } }).explain("executionStats")
关注 executionStats.totalDocsExamined 和 executionStats.executionTimeMillis 指标,优化方向包括:
MongoDB 聚合管道由多个阶段(Stage)组成,每个阶段对输入文档进行转换。
db.orders.aggregate([{ $match: { status: "completed" } }, // 过滤{ $group: { // 分组统计_id: "$customerId",total: { $sum: "$amount" },count: { $sum: 1 }}},{ $sort: { total: -1 } }, // 排序{ $limit: 5 } // 限制结果数])
$project:重命名字段或计算新字段$unwind:展开数组字段$lookup:关联其他集合(类似 SQL JOIN)$facet:多分支聚合示例:统计每个用户的订单数及平均金额:
db.orders.aggregate([{ $group: {_id: "$customerId",orders: { $sum: 1 },avgAmount: { $avg: "$amount" }}},{ $project: {customerId: "$_id",_id: 0,orders: 1,avgAmount: { $round: ["$avgAmount", 2] }}}])
使用 mongodump 工具:
mongodump --host localhost --port 27017 --db test --out /backup
恢复数据:
mongorestore --host localhost --port 27017 --db test /backup/test
对于大型数据库,建议使用文件系统快照:
fsyncLock 锁定数据库:
use admindb.runCommand({ fsync: 1, lock: 1 })
/data/db)fsyncUnlock 解锁:
db.runCommand({ fsyncUnlock: 1 })
watch() 监听集合变更,实现实时数据处理:
const collection = db.collection('users');const changeStream = collection.watch();changeStream.on('change', (change) => {console.log('变更事件:', change);});
--bind_ip 参数)通过系统掌握上述核心功能,开发者可以高效利用 MongoDB 处理各类非结构化数据场景,从日志分析到实时推荐系统均可发挥其优势。建议结合官方文档(docs.mongodb.com)持续学习高级特性如事务、地理空间查询等。