Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Docs 菜单
Docs 主页
/ / /
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() 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);

注意

读取偏好

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

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

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

有关读取偏好选项的更多信息,请参阅 MongoDB Server手册中的 读取偏好 。

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

字段
说明

<command result>

提供特定于数据库命令的字段。例如, 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字段。

注意

设置示例

此示例使用连接 URI 连接到MongoDB实例。要学习;了解有关连接到MongoDB实例的更多信息,请参阅 连接到MongoDB指南。此示例还使用Atlas示例数据集包含的 sample_mflix数据库中的 movies集合。您可以按照Atlas入门指南,将它们加载到MongoDB Atlas免费套餐上的数据库中。

注意

无Typescript特定功能

以下代码示例使用JavaScript。驾驶员没有与此使用案例相关的Typescript特定功能。

在以下示例代码中,我们发送 dbStats 命令以从 sample_mflix数据库请求统计信息:

1/* Run a database command */
2
3import { MongoClient } from "mongodb";
4
5// Replace the uri string with your MongoDB deployment's connection string
6const uri = "<connection string uri>";
7
8const client = new MongoClient(uri);
9
10async function run() {
11 try {
12 // Get the "sample_mflix" database
13 const db = client.db("sample_mflix");
14
15 // Find and print the storage statistics for the "sample_mflix" database using the 'dbStats' command
16 const result = await db.command({
17 dbStats: 1,
18 });
19 console.log(result);
20 } finally {
21 // Close the database connection on completion or error
22 await client.close();
23 }
24}
25run().catch(console.dir);

运行上述命令会产生以下输出:

{
db: 'sample_mflix',
collections: 6,
views: 0,
objects: 75620,
..

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

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

后退

索引

在此页面上