外观
MongoDB mongosh 命令
连接命令
基本连接
语法
bash
mongosh [options] [connectionString]
mongosh [options] [host:port]示例
bash
# 连接到本地默认实例
mongosh
# 连接到指定主机和端口
mongosh mongodb://localhost:27017
# 连接到复制集
mongosh "mongodb://primary:27017,secondary1:27017,secondary2:27017/?replicaSet=rs0"
# 连接到分片集群
mongosh "mongodb://mongos1:27017,mongos2:27017"
# 使用用户名和密码连接
mongosh "mongodb://username:password@localhost:27017/admin"连接选项
常用选项
--quiet:静默模式,减少输出--norc:不加载 ~/.mongoshrc.js 文件--eval <code>:执行 JavaScript 代码并退出--file <filename>:执行指定文件中的 JavaScript 代码--port <port>:指定端口号--host <hostname>:指定主机名--username <username>:指定用户名--password <password>:指定密码--authenticationDatabase <dbname>:指定认证数据库
示例
bash
# 执行单个命令并退出
mongosh --eval "db.collection.find().count()" test
# 执行脚本文件
mongosh --file script.js
# 使用用户名密码连接
mongosh --username admin --password password --authenticationDatabase admin数据库命令
查看当前数据库
语法
javascript
db示例
javascript
> db
admin切换数据库
语法
javascript
use <database>示例
javascript
> use test
switched to db test创建数据库
语法
javascript
use <database>
db.createCollection(<collection>)示例
javascript
> use mydb
switched to db mydb
> db.createCollection("users")
{ ok: 1 }删除数据库
语法
javascript
db.dropDatabase()示例
javascript
> use mydb
switched to db mydb
> db.dropDatabase()
{ ok: 1, dropped: 'mydb' }查看所有数据库
语法
javascript
show dbs示例
javascript
> show dbs
admin 0.000GB
config 0.000GB
test 0.000GB集合命令
查看当前数据库中的集合
语法
javascript
show collections示例
javascript
> show collections
users
posts
comments创建集合
语法
javascript
db.createCollection(<name>, <options>)参数说明
name:集合名称options:可选参数,包括:capped:是否为固定大小集合size:集合大小限制(字节)max:集合最大文档数validator:文档验证规则
示例
javascript
// 创建普通集合
db.createCollection("users")
// 创建固定大小集合
db.createCollection("logs", { capped: true, size: 1000000, max: 1000 })
// 创建带验证规则的集合
db.createCollection("products", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["name", "price"],
properties: {
name: { bsonType: "string" },
price: { bsonType: "number", minimum: 0 }
}
}
}
})删除集合
语法
javascript
db.<collection>.drop()示例
javascript
> db.users.drop()
true重命名集合
语法
javascript
db.<collection>.renameCollection(<newName>)示例
javascript
> db.oldCollection.renameCollection("newCollection")
{ ok: 1 }文档操作命令
插入文档
插入单个文档
javascript
db.<collection>.insertOne(<document>)示例
javascript
> db.users.insertOne({ name: "John", age: 30, email: "john@example.com" })
{
acknowledged: true,
insertedId: ObjectId("64c721f93e1f2a1b2c3d4e5f")
}插入多个文档
javascript
db.<collection>.insertMany(<documents>)示例
javascript
> db.users.insertMany([
{ name: "Alice", age: 25, email: "alice@example.com" },
{ name: "Bob", age: 35, email: "bob@example.com" }
])
{
acknowledged: true,
insertedIds: {
'0': ObjectId("64c7222d3e1f2a1b2c3d4e60"),
'1': ObjectId("64c7222d3e1f2a1b2c3d4e61")
}
}查询文档
查询所有文档
javascript
db.<collection>.find()
db.<collection>.find().pretty()示例
javascript
> db.users.find().pretty()
{
_id: ObjectId("64c721f93e1f2a1b2c3d4e5f"),
name: 'John',
age: 30,
email: 'john@example.com'
}
{
_id: ObjectId("64c7222d3e1f2a1b2c3d4e60"),
name: 'Alice',
age: 25,
email: 'alice@example.com'
}
{
_id: ObjectId("64c7222d3e1f2a1b2c3d4e61"),
name: 'Bob',
age: 35,
email: 'bob@example.com'
}条件查询
javascript
db.<collection>.find(<query>)
db.<collection>.findOne(<query>)示例
javascript
// 查询年龄大于 30 的用户
> db.users.find({ age: { $gt: 30 } })
// 查询特定名称的用户
> db.users.findOne({ name: "John" })
// 查询年龄在 25-35 之间的用户
> db.users.find({ age: { $gte: 25, $lte: 35 } })
// 查询多个条件
> db.users.find({ age: { $gt: 25 }, email: /example\.com/ })更新文档
更新单个文档
javascript
db.<collection>.updateOne(<filter>, <update>, <options>)示例
javascript
> db.users.updateOne(
{ name: "John" },
{ $set: { age: 31, updatedAt: new Date() } }
)
{
acknowledged: true,
insertedId: null,
matchedCount: 1,
modifiedCount: 1,
upsertedCount: 0
}更新多个文档
javascript
db.<collection>.updateMany(<filter>, <update>, <options>)示例
javascript
> db.users.updateMany(
{ email: /example\.com/ },
{ $set: { domain: "example.com" } }
)
{
acknowledged: true,
insertedId: null,
matchedCount: 3,
modifiedCount: 3,
upsertedCount: 0
}替换文档
javascript
db.<collection>.replaceOne(<filter>, <replacement>, <options>)示例
javascript
> db.users.replaceOne(
{ name: "John" },
{ name: "John Doe", age: 31, email: "john.doe@example.com" }
)
{
acknowledged: true,
insertedId: null,
matchedCount: 1,
modifiedCount: 1,
upsertedCount: 0
}删除文档
删除单个文档
javascript
db.<collection>.deleteOne(<filter>)示例
javascript
> db.users.deleteOne({ name: "John Doe" })
{
acknowledged: true,
deletedCount: 1
}删除多个文档
javascript
db.<collection>.deleteMany(<filter>)示例
javascript
> db.users.deleteMany({ age: { $lt: 30 } })
{
acknowledged: true,
deletedCount: 1
}索引命令
创建索引
语法
javascript
db.<collection>.createIndex(<keys>, <options>)示例
javascript
// 创建单字段索引
> db.users.createIndex({ name: 1 })
name_1
// 创建复合索引
> db.users.createIndex({ name: 1, age: -1 })
name_1_age_-1
// 创建唯一索引
> db.users.createIndex({ email: 1 }, { unique: true })
email_1
// 创建文本索引
> db.posts.createIndex({ title: "text", content: "text" })
title_text_content_text查看索引
语法
javascript
db.<collection>.getIndexes()示例
javascript
> db.users.getIndexes()
[
{
v: 2,
key: { _id: 1 },
name: '_id_',
ns: 'test.users'
},
{
v: 2,
key: { name: 1 },
name: 'name_1',
ns: 'test.users'
},
{
v: 2,
key: { email: 1 },
name: 'email_1',
ns: 'test.users',
unique: true
}
]删除索引
语法
javascript
db.<collection>.dropIndex(<index>)
db.<collection>.dropIndexes() // 删除所有非 _id 索引示例
javascript
// 删除指定索引
> db.users.dropIndex("name_1")
{ nIndexesWas: 3, ok: 1 }
// 删除所有非 _id 索引
> db.users.dropIndexes()
{ nIndexesWas: 2, ok: 1 }聚合命令
基本聚合
语法
javascript
db.<collection>.aggregate(<pipeline>)示例
javascript
// 计算每个年龄的用户数量
> db.users.aggregate([
{ $group: { _id: "$age", count: { $sum: 1 } } },
{ $sort: { count: -1 } }
])
// 计算平均年龄
> db.users.aggregate([
{ $group: { _id: null, avgAge: { $avg: "$age" } } }
])
// 连接两个集合
> db.orders.aggregate([
{ $lookup: {
from: "users",
localField: "userId",
foreignField: "_id",
as: "user"
}
}
])管理命令
查看服务器状态
语法
javascript
db.serverStatus()示例
javascript
> db.serverStatus().version
'6.0.5'
> db.serverStatus().connections
{
current: 10,
available: 818,
totalCreated: 100
}查看当前操作
语法
javascript
db.currentOp()
db.currentOp({ active: true })示例
javascript
// 查看所有活动操作
> db.currentOp({ active: true })
// 查看慢查询
> db.currentOp({ "secs_running": { $gt: 1 } })终止操作
语法
javascript
db.killOp(<opid>)示例
javascript
// 先查看操作 ID
> var op = db.currentOp({ active: true, "secs_running": { $gt: 5 } })
> db.killOp(op.inprog[0].opid)
{ info: "attempting to kill op", opid: 12345, ok: 1 }查看数据库统计信息
语法
javascript
db.stats()示例
javascript
> db.stats()
{
db: 'test',
collections: 2,
views: 0,
objects: 1000,
avgObjSize: 100,
dataSize: 100000,
storageSize: 40960,
indexes: 3,
indexSize: 24576,
totalSize: 65536,
scaleFactor: 1,
fileSize: 0,
fsUsedSize: 0,
fsTotalSize: 0,
numExtents: 0,
ok: 1
}查看集合统计信息
语法
javascript
db.<collection>.stats()示例
javascript
> db.users.stats()
{
ns: 'test.users',
size: 50000,
count: 500,
avgObjSize: 100,
storageSize: 20480,
freeStorageSize: 0,
capped: false,
wiredTiger: {...},
indexes: {...},
totalIndexSize: 16384,
indexSizes: {...},
scaleFactor: 1,
ok: 1
}复制集命令
查看复制集状态
语法
javascript
rs.status()示例
javascript
> rs.status()
{
set: 'rs0',
date: ISODate('2023-01-01T00:00:00.000Z'),
myState: 1,
term: Long(1),
syncSourceHost: '',
syncSourceId: -1,
members: [...],
ok: 1
}查看复制集配置
语法
javascript
rs.conf()示例
javascript
> rs.conf()
{
_id: 'rs0',
version: 3,
members: [...],
settings: {...}
}查看复制延迟
语法
javascript
rs.printSlaveReplicationInfo()示例
javascript
> rs.printSlaveReplicationInfo()
source: secondary1:27017
syncedTo: Thu Jan 01 2023 00:00:00 GMT+0000 (UTC)
0 secs (0 hrs) behind the primary
source: secondary2:27017
syncedTo: Thu Jan 01 2023 00:00:00 GMT+0000 (UTC)
0 secs (0 hrs) behind the primary分片集群命令
查看分片集群状态
语法
javascript
sh.status()示例
javascript
> sh.status()
--- Sharding Status ---
sharding version: {
_id: 1,
minCompatibleVersion: 5,
currentVersion: 6,
clusterId: ObjectId("64c723453e1f2a1b2c3d4e62")
}
shards: [...]
active mongoses: [...]
autosharding status: enabled
balancer: enabled
databases: [...]启用分片
语法
javascript
sh.enableSharding(<database>)示例
javascript
> sh.enableSharding("mydb")
{
ok: 1,
'$clusterTime': {
clusterTime: Timestamp({ t: 1672531200, i: 1 }),
signature: {...}
},
operationTime: Timestamp({ t: 1672531200, i: 1 })
}分片集合
语法
javascript
sh.shardCollection(<namespace>, <key>, <options>)示例
javascript
> sh.shardCollection("mydb.users", { "_id": "hashed" })
{
collectionsharded: 'mydb.users',
ok: 1,
'$clusterTime': {
clusterTime: Timestamp({ t: 1672531200, i: 2 }),
signature: {...}
},
operationTime: Timestamp({ t: 1672531200, i: 2 })
}版本差异
MongoDB 4.0+ mongosh 特性
- 引入 mongosh 作为新的 shell 工具
- 支持现代 JavaScript 语法
- 增强的自动补全功能
- 更好的错误处理
MongoDB 5.0+ mongosh 特性
- 支持更丰富的命令行选项
- 增强的脚本执行能力
- 改进的输出格式化
- 支持更多的编程语言集成
MongoDB 6.0+ mongosh 特性
- 支持内置的可视化解释计划
- 增强的诊断命令
- 改进的复制集和分片集群管理
- 支持更多的安全功能
最佳实践
连接安全
- 使用 TLS/SSL 加密连接
- 避免在命令行中直接指定密码
- 使用最小权限原则配置用户
- 定期轮换密码
命令执行
- 对于大型集合,使用
limit()限制结果数量 - 使用
pretty()格式化输出,提高可读性 - 避免在生产环境执行耗时较长的命令
- 使用
explain()分析查询性能
脚本编写
- 将常用操作封装为函数
- 使用
try/catch处理异常 - 记录脚本执行日志
- 测试脚本在非生产环境
性能优化
- 使用索引提高查询性能
- 避免全表扫描
- 合理使用聚合管道
- 监控慢查询日志
常见问题(FAQ)
Q1: mongosh 和 mongo shell 有什么区别?
A1: mongosh 是 mongo shell 的继任者,提供了以下改进:
- 支持现代 JavaScript 语法(ES6+)
- 更好的自动补全功能
- 增强的错误处理和调试
- 改进的输出格式化
- 更好的扩展性和插件支持
Q2: 如何在 mongosh 中执行多行命令?
A2: 在 mongosh 中,可以直接输入多行命令,系统会自动识别命令的完整性:
javascript
> db.users.updateMany(
... { age: { $gt: 30 } },
... { $set: { status: "active" } }
... )Q3: 如何保存 mongosh 的输出到文件?
A3: 可以使用以下方法保存输出:
- 使用
--eval选项结合 shell 重定向:mongosh --eval "db.users.find()" > output.json - 在 mongosh 中使用
printjson()函数结合文件操作 - 使用 MongoDB Compass 等 GUI 工具导出数据
Q4: 如何在 mongosh 中使用环境变量?
A4: 可以使用以下方法在 mongosh 中使用环境变量:
javascript
> const username = process.env.MONGO_USERNAME;
> const password = process.env.MONGO_PASSWORD;
> const uri = `mongodb://${username}:${password}@localhost:27017`;Q5: 如何调试 mongosh 脚本?
A5: 调试 mongosh 脚本的方法:
- 使用
print()或console.log()输出调试信息 - 使用
try/catch捕获和处理异常 - 使用
debugger语句结合 Chrome DevTools 调试 - 逐步执行脚本,检查中间结果
Q6: 如何提高 mongosh 的执行性能?
A6: 提高 mongosh 执行性能的方法:
- 减少网络往返,使用批量操作
- 合理使用索引
- 避免在循环中执行数据库操作
- 使用
cursor.batchSize()调整批量大小 - 对于大型结果集,使用流式处理
Q7: 如何在 mongosh 中使用外部模块?
A7: mongosh 支持使用 ESM 模块:
javascript
> import { MongoClient } from 'mongodb';
> const client = new MongoClient(uri);注意:需要确保模块已安装,并且 mongosh 配置支持模块加载。
Q8: 如何配置 mongosh 的默认选项?
A8: 可以通过以下方式配置 mongosh 的默认选项:
- 创建
~/.mongoshrc.js文件,添加默认配置 - 使用环境变量
MONGOSH_OPTS指定默认选项 - 创建配置文件
.mongoshrc.json存储配置
Q9: 如何从 mongo shell 迁移到 mongosh?
A9: 迁移到 mongosh 的步骤:
- 安装 mongosh(通常与 MongoDB 一起安装)
- 测试现有脚本在 mongosh 中的兼容性
- 逐步替换生产环境中的 mongo shell 使用
- 更新文档和培训材料
Q10: mongosh 支持哪些操作系统?
A10: mongosh 支持以下操作系统:
- Windows
- macOS
- Linux(各种发行版)
- Docker 容器
可以从 MongoDB 官方网站下载对应平台的安装包。
