文档菜单
文档首页
/ / /
Node.js 驱动程序
/

运行命令

在本页

  • 概述
  • 执行命令
  • 命令选项
  • 响应
  • 示例
  • 输出
  • 附加信息

在本指南中,您可以学习如何使用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()方法接受一个RunCursorCommandOptions对象。有关RunCursorCommandOptions类型的更多信息,请参阅API文档。

从Node.js驱动程序的6.0版本开始,您可以为command()方法传递以下选项

  • comment

  • enableUtf8Validation

  • raw

  • readPreference

  • session

您可以在传递给 command() 方法的文档中设置更多选项。要了解有关命令及其接受的选项的更多信息,请定位命令并查看服务器手册中数据库命令部分的链接。

以下代码演示了如何指定一个执行时具有 majority 写入关注的 grantRolesToUser 命令。

const commandDoc = {
grantRolesToUser: "user011",
roles: [ "readWrite" ],
writeConcern: { w: "majority" }
};
const result = await myDB.command(commandDoc);

注意

读取偏好

command()runCursorCommand() 方法会忽略您可能在 Db 对象上设置的读取偏好设置。默认情况下,这些方法使用 primary 读取偏好。

以下代码演示了如何指定读取偏好并将其作为选项传递给 command() 方法。

const commandOptions = { readPreference: "nearest" };
const result = await myDB.command(commandDoc, commandOptions);

有关读取偏好选项的更多信息,请参阅服务器手册中的读取偏好

每个方法都返回一个包含执行命令后数据库响应的 Document 对象或游标。每个数据库命令执行不同的功能,因此响应内容可能因命令而异。然而,每个响应都包含具有以下字段的文档

字段
描述
<命令结果>
提供特定于数据库命令的字段。例如,count 返回 n 字段,而 explain 返回 queryPlanner 字段。
ok
指示命令是否成功(1)或失败(0)。
operationTime
指示操作的逻辑时间。MongoDB 使用逻辑时间来排序操作。有关逻辑时间的更多信息,请参阅我们关于全局逻辑时钟的博客文章。
$clusterTime

提供返回签名集群时间的文档。集群时间用于排序操作。

该文档包含以下字段

  • clusterTime,即成员的最高已知集群时间的时间戳。

  • signature,即包含集群时间哈希和用于签名集群时间的密钥 ID 的文档。

以下代码演示了如何使用 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: ...,
...
}
}

注意

如果您将命令响应存储在游标中,当访问游标的内容时,您将只看到命令结果文档。您将看不到 okoperationTime$clusterTime 字段。

有关本指南中的概念更多信息,请参阅以下文档

要了解如何从游标检索数据,请参阅从游标访问数据 基础知识页面。

返回

事务