MongoDB Shell 操作指南:从数据库管理到文档操作
MongoDB 提供了交互式 Shell(mongo)工具,用于直接操作数据库。本文通过 Shell 可以执行数据库创建、用户管理、文档 CRUD 等操作,是日常管理和调试的重要工具。本文详细介绍 MongoDB Shell 的核心操作。
数据库基本操作
切换 / 创建数据库
使用 use 命令切换到指定数据库,若数据库不存在则自动创建(但需插入数据后才会显示):
1
| use mydb # 切换到mydb数据库,不存在则创建
|
查看所有数据库
1
| show dbs # 列出所有非空数据库(空数据库不显示)
|
查看当前数据库
删除当前数据库
1
| db.dropDatabase() # 谨慎操作!删除当前数据库所有数据
|
用户管理
MongoDB 通过角色权限控制访问,支持创建不同权限的用户(如管理员、读写用户等)。
创建用户
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| # 创建超级管理员(root角色) db.createUser({ user: "root", # 用户名 pwd: "root123", # 密码 roles: ["root"] # 角色(root为超级权限) })
# 创建自定义权限用户 db.createUser({ user: "appuser", pwd: "app123", roles: [ { role: "readWrite", db: "mydb" }, # 对mydb数据库有读写权限 { role: "read", db: "logdb" } # 对logdb数据库有只读权限 ] })
|
常用角色说明
| 角色类型 |
角色标识 |
说明 |
| 数据库用户角色 |
read、readWrite |
分别对应只读、读写权限 |
| 数据库管理角色 |
dbAdmin、dbOwner、userAdmin |
数据库管理、所有者、用户管理权限 |
| 集群管理角色 |
clusterAdmin、clusterMonitor |
集群管理、监控权限 |
| 超级用户角色 |
root |
所有数据库的最高权限 |
查看用户
1
| show users # 查看当前数据库下的所有用户
|
修改用户密码
1
| db.updateUser("appuser", { pwd: "newapp123" }) # 修改appuser的密码
|
删除用户
1
| db.dropUser("appuser") # 删除当前数据库下的appuser用户
|
用户登录(认证)
1
| db.auth("appuser", "app123") # 认证成功返回1,失败返回0
|
集合(Collection)操作
集合类似关系型数据库的 “表”,无需预先创建,插入文档时会自动生成。
创建集合(可选)
1
| db.createCollection("users") # 显式创建users集合(通常无需手动创建)
|
查看集合
1
| show collections # 列出当前数据库的所有集合
|
删除集合
1
| db.users.drop() # 删除users集合(包含所有文档)
|
文档(Document)操作
文档是 MongoDB 的基本数据单元(类似 JSON 对象),以下是常用的 CRUD 操作。
插入文档
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| # 插入单条文档(_id可选,不指定则自动生成ObjectId) db.users.insertOne({ _id: 1, # 自定义主键 name: "Alice", age: 25, email: "alice@example.com", hobbies: ["reading", "hiking"] })
# 插入多条文档 db.users.insertMany([ { name: "Bob", age: 30, email: "bob@example.com" }, { name: "Charlie", age: 35, email: "charlie@example.com" } ])
|
查询文档
(1)基本查询
1 2
| db.users.find() # 查询users集合所有文档(默认显示20条,按Enter加载更多) db.users.find().pretty() # 格式化输出,便于阅读
|
(2)条件查询
| 操作符 |
说明 |
示例 |
$gt |
大于 |
{ age: { $gt: 25 } } |
$gte |
大于等于 |
{ age: { $gte: 25 } } |
$lt |
小于 |
{ age: { $lt: 30 } } |
$lte |
小于等于 |
{ age: { $lte: 30 } } |
$eq |
等于 |
{ name: { $eq: "Alice" } } 或 { name: "Alice" } |
$ne |
不等于 |
{ age: { $ne: 25 } } |
$in |
在数组中 |
{ hobbies: { $in: ["reading", "sports"] } } |
$nin |
不在数组中 |
{ hobbies: { $nin: ["gaming"] } } |
示例:
1 2 3 4 5
| # 查询年龄25-30岁(含)的用户 db.users.find({ age: { $gte: 25, $lte: 30 } }).pretty()
# 查询爱好包含"reading"的用户 db.users.find({ hobbies: { $in: ["reading"] } })
|
(3)投影查询(只返回指定字段)
1 2
| # 只返回name和age字段(_id默认显示,需显式关闭) db.users.find({ age: { $gt: 25 } }, { name: 1, age: 1, _id: 0 })
|
(4)排序与分页
1 2 3 4 5
| # 按年龄升序排序(1:升序,-1:降序) db.users.find().sort({ age: 1 })
# 跳过前2条,取3条(分页) db.users.find().skip(2).limit(3)
|
更新文档
(1)更新单条文档(updateOne)
1 2 3 4 5
| # 将name为"Alice"的文档,age改为26 db.users.updateOne( { name: "Alice" }, # 条件 { $set: { age: 26, email: "alice.new@example.com" } } # 更新内容($set只更新指定字段) )
|
(2)更新多条文档(updateMany)
1 2 3 4 5
| # 将所有age<30的用户,添加"young"标签 db.users.updateMany( { age: { $lt: 30 } }, { $set: { tag: "young" } } )
|
(3)替换文档(replaceOne)
1 2 3 4 5
| # 完全替换name为"Bob"的文档(保留_id,其他字段全替换) db.users.replaceOne( { name: "Bob" }, { name: "Bob", age: 31, email: "bob.updated@example.com", city: "Beijing" } )
|
(4)更新选项(options)
1 2 3 4 5 6
| # 若不存在name为"Dave"的文档,则插入(upsert: true) db.users.updateOne( { name: "Dave" }, { $set: { age: 40 } }, { upsert: true } )
|
删除文档
(1)删除单条文档(deleteOne)
1
| db.users.deleteOne({ name: "Charlie" }) # 删除name为"Charlie"的第一条文档
|
(2)删除多条文档(deleteMany)
1 2 3 4 5
| # 删除所有age>35的文档 db.users.deleteMany({ age: { $gt: 35 } })
# 删除集合所有文档(保留集合结构) db.users.deleteMany({})
|
v1.3.10