第2章 MongoDB操作命令
2.1 数据库基础操作
默认数据库说明
MongoDB有以下预置数据库:
- test:默认登录数据库,用于测试和开发
- admin:系统管理数据库,存储用户认证和权限信息
- local:本地数据库,存储副本集和分片的关键日志
- config:配置数据库,存储分片集群的配置信息
基础查看命令
# 查看当前所在数据库
db
# 查看所有数据库
show dbs
show databases
# 查看当前数据库的所有集合
show collections
show tables
# 切换数据库(不存在则创建)
use database_name
MongoDB特殊机制
📝 数据库创建机制
MongoDB采用延迟创建策略:
- 使用
use
切换到不存在的数据库时,数据库并不会立即创建 - 只有当向数据库中插入数据时,数据库和集合才会真正创建
- 空数据库不会在
show dbs
中显示
Shell执行命令
# 在shell中直接执行MongoDB命令
echo "show dbs" | mongo
echo "use test; show collections" | mongo
数据插入操作
插入单条文档
// 基本插入语法
db.collection_name.insertOne({document})
// 示例:插入用户信息
db.user_info.insertOne({
name: "zhang",
age: 29,
host: "北京"
})
db.user_info.insertOne({
name: "yazhang",
age: 29,
host: "上海"
})
插入多条文档
// 批量插入语法
db.collection_name.insertMany([{document1}, {document2}, ...])
// 示例:批量插入用户信息
db.user_info.insertMany([
{name: "zhang", age: 29, host: "北京"},
{name: "yazhang", age: 29, host: "上海"},
{name: "yaya", age: 29, host: "深圳"}
])
// 插入复杂文档结构
db.inventory.insertMany([
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
])
💡 批量插入优势
使用 insertMany()
比多次调用 insertOne()
更高效,能够减少网络往返次数。
数据查询操作
基础查询
// 查询单条文档
db.user_info.findOne()
// 等同于 SQL: SELECT * FROM user_info LIMIT 1;
// 查询所有文档
db.user_info.find()
// 等同于 SQL: SELECT * FROM user_info;
// 按条件查询
db.user_info.find({name: "zhang"})
// 等同于 SQL: SELECT * FROM user_info WHERE name="zhang";
字段投影查询
// 语法:find({查询条件}, {字段投影})
// 1表示显示,0表示隐藏,_id默认显示需要明确设置0隐藏
db.user_info.find(
{name: "zhang"},
{name: 1, age: 1, _id: 0}
)
// 等同于 SQL: SELECT name,age FROM user_info WHERE name="zhang";
嵌套文档查询
// 查询嵌套字段,使用点号表示法
db.inventory.find({"size.uom": "cm"})
// 格式化写法
db.inventory.find({
"size.uom": "cm"
})
逻辑查询
AND 查询
// 多个条件默认为AND关系
db.inventory.find({
status: "A",
"size.uom": "cm"
})
// 等同于 SQL: SELECT * FROM inventory WHERE status="A" AND size.uom="cm";
// 带字段投影的AND查询
db.inventory.find(
{
status: "A",
"size.uom": "cm"
},
{
_id: 0,
status: 1,
"size.uom": 1
}
)
OR 查询
// OR查询语法
db.collection.find({
$or: [
{条件1},
{条件2}
]
})
// 示例:状态为D或单位为cm
db.inventory.find({
$or: [
{ status: "D" },
{ "size.uom": "cm" }
]
})
// 等同于 SQL: SELECT * FROM inventory WHERE status = "D" OR size.uom = "cm";
// 示例:状态为A或数量小于30
db.inventory.find({
$or: [
{ status: "A" },
{ qty: { $lt: 30 } }
]
})
// 等同于 SQL: SELECT * FROM inventory WHERE status = "A" OR qty < 30;
复合逻辑查询
// AND + OR + 正则表达式组合查询
db.inventory.find({
status: "A",
$or: [
{ qty: { $lt: 30 } },
{ item: /^p/ }
]
})
// 等同于 SQL: SELECT * FROM inventory WHERE status = "A" AND (qty < 30 OR item LIKE "p%")
📚 比较操作符
常用的MongoDB比较操作符:
$lt
: 小于 (less than)$lte
: 小于等于 (less than or equal)$gt
: 大于 (greater than)$gte
: 大于等于 (greater than or equal)$ne
: 不等于 (not equal)$in
: 在指定数组中$nin
: 不在指定数组中
数据更新操作
更新单条文档
// 语法:updateOne({查询条件}, {更新操作})
db.inventory.updateOne(
{ item: /^p/ },
{ $set: { status: "P" } }
)
// 查看更新结果
db.inventory.find({ item: /^p/ })
更新多条文档
// 更新所有匹配的文档
db.inventory.updateMany(
{ item: /^p/ },
{ $set: { status: "P" } }
)
添加新字段
// 使用$set操作符添加新字段
db.inventory.updateOne(
{ item: /^p/ },
{ $set: { name: "zhangya" } }
)
⚠️ 更新操作注意事项
- 使用
$set
操作符更新字段,避免直接替换整个文档 updateOne()
只更新第一个匹配的文档updateMany()
更新所有匹配的文档- 更新操作会返回匹配和修改的文档数量
数据删除操作
删除单条文档
// 删除第一个匹配的文档
db.inventory.deleteOne({status: "P"})
// 删除前查看要删除的数据
db.inventory.find({status: "P"})
删除多条文档
// 删除所有匹配的文档
db.inventory.deleteMany({status: "P"})
删除集合
// 删除整个集合
db.user_info.drop()
删除数据库
// 删除当前数据库
db.dropDatabase()
⚠️ 删除操作警告
删除操作不可逆,执行前请确认:
- 删除数据库会丢失所有数据和索引
- 删除集合会丢失该集合的所有文档和索引
- 生产环境操作前务必备份数据
索引管理
查看执行计划
// 分析查询性能
db.user_info.find({age: 29}).explain()
创建索引
// 创建单字段索引
db.user_info.createIndex(
{ age: 1 }, // 1为升序,-1为降序
{ background: true } // 后台创建,不阻塞其他操作
)
// 创建复合索引
db.user_info.createIndex({
name: 1,
age: -1
})
查看索引
// 查看集合的所有索引
db.user_info.getIndexes()
删除索引
// 按索引名删除
db.user_info.dropIndex("age_1")
// 按索引规格删除
db.user_info.dropIndex({age: 1})
执行计划关键词
理解查询执行计划的关键指标:
- COLLSCAN:全表扫描,性能较差
- IXSCAN:索引扫描,性能良好
- FETCH:根据索引获取完整文档
- SHARD_MERGE:分片结果合并
- SORT:显式排序(未使用索引排序)
💡 索引最佳实践
- 为频繁查询的字段创建索引
- 复合索引的字段顺序很重要
- 使用
background: true
在生产环境创建索引 - 定期检查和清理不必要的索引
集合和数据库管理
集合操作
// 显式创建集合
db.createCollection("new_collection")
// 查看集合统计信息
db.user_info.stats()
// 重命名集合
db.old_collection.renameCollection("new_collection")
数据库操作
// 查看数据库统计信息
db.stats()
// 检查数据库大小
db.runCommand("dbStats")
Shell执行技巧
# 批量执行命令
mongo --eval "
use test;
db.user_info.find().forEach(printjson);
"
# 执行JavaScript文件
mongo test script.js
# 静默模式执行
mongo --quiet test --eval "db.user_info.count()"
📖 学习资源
MongoDB官方CRUD操作文档:https://docs.mongodb.com/manual/crud/
更新: 2025-01-26