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数据库有只读权限
  ]
})

常用角色说明

角色类型 角色标识 说明
数据库用户角色 readreadWrite 分别对应只读、读写权限
数据库管理角色 dbAdmindbOwneruserAdmin 数据库管理、所有者、用户管理权限
集群管理角色 clusterAdminclusterMonitor 集群管理、监控权限
超级用户角色 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({})