Appearance
数据库操作
本章将介绍MongoDB数据库的创建、切换、查看和删除等基本操作。
数据库概念
数据库的组织结构
javascript
// MongoDB的数据组织结构:
// 1. 数据库(Database)
// - 数据库是集合的容器
// - 一个MongoDB实例可以包含多个数据库
// 2. 集合(Collection)
// - 集合是文档的容器,类似于关系数据库的表
// - 一个数据库可以包含多个集合
// 3. 文档(Document)
// - 文档是数据的基本单位,类似于关系数据库的行
// - 一个集合可以包含多个文档
// 层级关系:
// MongoDB实例 -> 数据库 -> 集合 -> 文档系统数据库
javascript
// MongoDB内置的系统数据库:
// 1. admin
// - 管理数据库,存储用户和权限信息
// - 存储集群配置信息
// - 必须先连接到admin数据库才能执行某些管理命令
// 2. local
// - 存储本地服务器数据
// - 复制集中的oplog存储在这里
// - local数据库不会被复制到其他节点
// 3. config
// - 存储分片集群的配置信息
// - 分片集群的元数据存储在这里
// 查看所有数据库
show dbs
// 输出示例:
// admin 40.00 KiB
// config 72.00 KiB
// local 40.00 KiB创建数据库
使用use命令创建
javascript
// MongoDB没有专门的创建数据库命令
// 使用use命令切换到数据库,当插入数据时自动创建
// 切换到新数据库(如果不存在则创建)
use mydb
// 输出:switched to db mydb
// 此时数据库还未真正创建,需要插入数据才会创建
// 查看数据库列表,mydb不会出现
show dbs
// 插入一条数据后,数据库会被创建
db.users.insertOne({ name: "张三" })
// 输出:
// {
// acknowledged: true,
// insertedId: ObjectId("...")
// }
// 再次查看数据库列表
show dbs
// 输出示例:
// admin 40.00 KiB
// config 72.00 KiB
// local 40.00 KiB
// mydb 72.00 KiB // 新创建的数据库数据库命名规则
javascript
// MongoDB数据库名称的命名规则:
// 1. 名称限制
// - 不能是空字符串
// - 不能包含 / \ . " $ * < > : | ?
// - 不能以.开头
// - 建议使用小写字母
// - 最大长度64字节
// 2. 推荐命名方式
// - 使用小写字母
// - 使用下划线分隔单词
// - 名称要有意义
// 推荐的数据库名称示例
use blog_system // 博客系统
use user_center // 用户中心
use order_service // 订单服务
use product_db // 产品数据库
// 不推荐的数据库名称示例
// use BlogSystem // 不推荐使用大写
// use blog-system // 不推荐使用连字符
// use 123db // 不推荐数字开头查看数据库
查看所有数据库
javascript
// 查看所有数据库
show dbs
// 或
show databases
// 输出示例:
// admin 40.00 KiB
// config 72.00 KiB
// local 40.00 KiB
// mydb 72.00 KiB
// 注意:空数据库(没有数据)不会显示在列表中查看当前数据库
javascript
// 查看当前使用的数据库
db
// 输出:mydb
// 或使用db.getName()方法
db.getName()
// 输出:mydb查看数据库状态
javascript
// 查看当前数据库的统计信息
db.stats()
// 输出示例:
// {
// db: 'mydb',
// collections: 2, // 集合数量
// views: 0, // 视图数量
// objects: 100, // 文档数量
// avgObjSize: 111.0, // 平均文档大小
// dataSize: 11100, // 数据大小(字节)
// storageSize: 36864, // 存储大小(字节)
// indexes: 2, // 索引数量
// indexSize: 36864, // 索引大小(字节)
// totalSize: 73728, // 总大小
// scaleFactor: 1,
// fileSize: 0,
// fsUsedSize: 0,
// fsTotalSize: 0,
// ok: 1
// }
// 查看数据库的详细状态
db.stats(1024) // 以KB为单位显示
db.stats(1024*1024) // 以MB为单位显示查看数据库大小
javascript
// 查看数据库大小
db.stats().dataSize // 数据大小(字节)
db.stats().storageSize // 存储大小(字节)
db.stats().indexSize // 索引大小(字节)
db.stats().totalSize // 总大小(字节)
// 格式化显示大小
function formatSize(bytes) {
if (bytes < 1024) return bytes + ' B';
if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(2) + ' KB';
if (bytes < 1024 * 1024 * 1024) return (bytes / (1024 * 1024)).toFixed(2) + ' MB';
return (bytes / (1024 * 1024 * 1024)).toFixed(2) + ' GB';
}
// 使用
print("数据大小: " + formatSize(db.stats().dataSize))
print("存储大小: " + formatSize(db.stats().storageSize))
print("索引大小: " + formatSize(db.stats().indexSize))切换数据库
使用use命令
javascript
// 切换到指定数据库
use mydb
// 输出:switched to db mydb
// 切换到admin数据库
use admin
// 输出:switched to db admin
// 切换到不存在的数据库(会创建)
use newdb
// 输出:switched to db newdb切换到系统数据库
javascript
// 切换到admin数据库(执行管理操作)
use admin
// 切换到local数据库(查看复制集信息)
use local
// 切换到config数据库(查看分片配置)
use config删除数据库
删除当前数据库
javascript
// 删除当前数据库
// 注意:删除操作不可逆,请谨慎操作!
// 1. 先切换到要删除的数据库
use mydb
// 2. 确认当前数据库
db
// 输出:mydb
// 3. 删除数据库
db.dropDatabase()
// 输出示例:
// { ok: 1, dropped: 'mydb' }
// 4. 确认删除
show dbs
// mydb已不在列表中删除数据库的安全做法
javascript
// 安全删除数据库的步骤
// 1. 确认要删除的数据库名称
var dbName = db.getName()
print("当前数据库: " + dbName)
// 2. 备份数据(可选但推荐)
// 使用mongodump命令备份
// mongodump --db mydb --out /backup/
// 3. 查看数据库中的集合
show collections
// 4. 确认后删除
db.dropDatabase()
// 5. 验证删除结果
show dbs数据库管理命令
复制数据库
javascript
// 复制数据库(MongoDB 4.2+已弃用copyDatabase命令)
// 推荐使用聚合管道+out实现
// 方法一:使用聚合管道复制集合
db.sourceCollection.aggregate([
{ $match: {} }, // 匹配所有文档
{ $out: "targetCollection" } // 输出到目标集合
])
// 方法二:使用mongodump和mongorestore
// 在命令行执行:
// mongodump --db sourcedb --out /tmp/backup
// mongorestore --db targetdb /tmp/backup/sourcedb
// 方法三:编写脚本复制整个数据库
var sourceDb = db.getSiblingDB("sourcedb")
var targetDb = db.getSiblingDB("targetdb")
// 获取源数据库的所有集合
var collections = sourceDb.getCollectionNames()
// 复制每个集合
collections.forEach(function(collectionName) {
if (!collectionName.startsWith("system.")) {
sourceDb.getCollection(collectionName).aggregate([
{ $match: {} },
{ $out: collectionName }
])
print("已复制集合: " + collectionName)
}
})修复数据库
javascript
// 修复数据库(压缩数据文件,回收空间)
// 修复当前数据库
db.repairDatabase()
// 输出示例:
// { "ok" : 1 }
// 注意:
// 1. repairDatabase会重建数据库文件
// 2. 需要足够的磁盘空间(至少是当前数据的2倍)
// 3. 操作期间数据库会锁定
// 4. 建议在维护窗口执行
// 使用compact命令压缩集合(推荐)
db.runCommand({ compact: "collectionName" })数据库配置
javascript
// 查看数据库的profiling级别
db.getProfilingLevel()
// 0: 关闭
// 1: 只记录慢操作
// 2: 记录所有操作
// 设置profiling级别
db.setProfilingLevel(1, 50) // 级别1,记录超过50ms的操作
// 查看profiling状态
db.getProfilingStatus()
// 输出示例:
// { was: 1, slowms: 50, sampleRate: 1 }
// 查看数据库参数
db.adminCommand({ getParameter: 1 })
// 设置数据库参数
db.adminCommand({ setParameter: 1, logLevel: 1 })数据库权限管理
创建管理员用户
javascript
// 在admin数据库中创建管理员用户
// 切换到admin数据库
use admin
// 创建管理员用户
db.createUser({
user: "admin", // 用户名
pwd: "password123", // 密码
roles: [
{ role: "userAdminAnyDatabase", db: "admin" }, // 用户管理权限
{ role: "readWriteAnyDatabase", db: "admin" }, // 读写权限
{ role: "dbAdminAnyDatabase", db: "admin" } // 数据库管理权限
]
})
// 输出示例:
// { ok: 1 }创建数据库用户
javascript
// 为特定数据库创建用户
// 切换到目标数据库
use mydb
// 创建读写用户
db.createUser({
user: "appuser",
pwd: "password123",
roles: [
{ role: "readWrite", db: "mydb" } // 读写权限
]
})
// 创建只读用户
db.createUser({
user: "readonly",
pwd: "password123",
roles: [
{ role: "read", db: "mydb" } // 只读权限
]
})本章小结
本章介绍了MongoDB数据库的基本操作:
- 数据库概念:理解数据库、集合、文档的层级关系
- 系统数据库:了解admin、local、config三个系统数据库
- 创建数据库:使用use命令创建数据库
- 查看数据库:使用show dbs、db.stats()查看数据库信息
- 切换数据库:使用use命令切换数据库
- 删除数据库:使用db.dropDatabase()删除数据库
- 数据库管理:掌握复制、修复、配置等管理操作
下一章,我们将学习集合操作,了解如何创建和管理MongoDB集合。
