跳到主要内容

第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