运行命令
Overview
在本指南中,您可以了解如何使用 Node.js 驱动程序运行数据库命令。您可以使用数据库命令执行各种管理和诊断任务,例如获取服务器统计数据、初始化副本集或运行聚合管道。
重要
首选驱动程序方法而非数据库命令
驱动程序为许多数据库命令提供了封装方法。我们建议尽可能使用驱动程序方法,而不是执行数据库命令。
要执行管理任务,请使用 MongoDB Shell而不是 Node.js 驱动程序。 在shell内调用 db.runCommand()
方法是发出数据库命令的首选方法,因为它在shell和驱动程序之间提供了一致的接口。
执行命令
如要运行数据库命令,您必须在文档中指定命令和任何相关的参数,然后将该文档传递给命令执行方法。Node.js 驱动程序提供了以下方法来运行数据库命令:
command()
,将以Document
类型返回命令响应。 您可以将此方法与任何数据库命令一起使用。runCursorCommand()
,将以可迭代的RunCommandCursor
类型返回命令响应。 仅当数据库命令返回多个结果文档时,才能使用此方法。
以下代码展示如何使用command()
方法运行hello
命令,该命令会返回有关数据库中副本集中当前成员角色的信息:
const result = await myDB.command({ hello: 1 });
有关数据库命令和相应参数的完整列表,请参阅“其他信息”部分。
命令选项
您可以为command()
和runCursorCommand()
方法指定可选命令行为。
command()
方法接受一个 RunCommandOptions
对象。要学习;了解有关RunCommandOptions
类型的更多信息,请参阅API文档。
runCursorCommand() method
接受一个RunCursorCommandOptions
对象。 要了解有关RunCursorCommandOptions
类型的更多信息,请参阅 API 文档。
从 Node.js 驱动程序 6.0 版开始,您只能将以下选项传递给command()
方法:
comment
enableUtf8Validation
raw
readPreference
session
您可以在传递给command()
方法的文档中设置更多选项。 要了解有关命令及其接受的选项的更多信息,请找到该命令并点击 手册 数据库命令MongoDB Server 部分的链接。
以下代码演示如何指定使用majority
写关注(write concern)执行的grantRolesToUser
命令:
const commandDoc = { grantRolesToUser: "user011", roles: [ "readWrite" ], writeConcern: { w: "majority" } }; const result = await myDB.command(commandDoc);
响应
执行命令后,每个方法都会返回一个Document
对象或游标,其中包含数据库的响应。 每个数据库命令执行不同的功能,因此响应内容可能因命令而异。 但是,每个响应都包含具有以下字段的文档:
字段 | 说明 |
---|---|
<command result> | 提供特定于数据库命令的字段。例如, |
| 表明命令是成功( |
| 指示操作的逻辑时间。 MongoDB使用逻辑时间对操作进行排序。 要学习;了解有关逻辑时间的更多信息,请参阅我们有关全局逻辑时钟的博文文。 |
| 提供返回签名集群时间的文档。 集群时间是用于操作排序的逻辑时间。 该文档包含以下字段:
|
例子
以下代码展示了如何使用runCursorCommand()
方法在testDB
数据库上运行checkMetadataConsistency
命令并遍历结果:
// Connect to the "testDB" database const db = client.db("testDB"); // Run a cursor command to check metadata consistency within the database const cursor = await db.runCursorCommand({ checkMetadataConsistency: 1, }); // Iterate through the cursor's results and print the contents for await (const doc of cursor) { console.log(doc); }
输出
输出包含游标对象的内容。这些文档描述了数据库中任何元数据不一致的情况:
{ type: ..., description: ..., details: { namespace: ..., info: ... } } { type: ..., description: ..., details: { namespace: ..., collectionUUID: ..., maxKeyObj: ..., ... } }
注意
如果将命令响应存储在游标中,则在访问游标内容时只能看到命令结果文档。 您不会看到ok
、 operationTime
和$clusterTime
字段。
更多信息
有关本指南中概念的更多信息,请参阅以下文档:
要学习;了解如何从游标检索数据,请参阅从游标访问数据基础知识页面。