Skip to content

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 的步骤:

  1. 安装 mongosh(通常与 MongoDB 一起安装)
  2. 测试现有脚本在 mongosh 中的兼容性
  3. 逐步替换生产环境中的 mongo shell 使用
  4. 更新文档和培训材料

Q10: mongosh 支持哪些操作系统?

A10: mongosh 支持以下操作系统:

  • Windows
  • macOS
  • Linux(各种发行版)
  • Docker 容器

可以从 MongoDB 官方网站下载对应平台的安装包。