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