如何使用MongoDBShell

来自菜鸟教程
跳转至:导航、​搜索

作为 Write for DOnations 计划的一部分,作者选择了 Open Internet/Free Speech Fund 来接受捐赠。

介绍

诸如 MongoDB 之类的数据库系统通常与连接到数据库服务器并执行操作(例如读取和处理数据或写入新条目)的外部应用程序一起使用。 在这种情况下,您不会直接与数据库服务器交互。 但是,要对数据库执行管理任务或自己执行临时数据库查询,可能需要直接访问。

这就是 MongoDB shell 的用武之地。 MongoDB shell 是一个交互式控制台,您可以使用它连接到数据库服务器并在其上执行命令,从而允许您执行管理任务以及直接读取、写入或操作数据。 MongoDB shell 使您能够从命令行提示符连接到数据库,并从终端窗口以交互方式使用它。 它还允许您运行外部脚本以更方便地执行重复任务。

在本教程中,您将使用 MongoDB shell 连接到 MongoDB 数据库并以交互方式查询数据库。 您还将使用 shell 中包含的内置帮助系统和自动完成功能。

先决条件

要遵循本教程,您将需要:

  • 具有 sudo 权限的常规非 root 用户和配置了 UFW 的防火墙的服务器。 本教程使用运行 Ubuntu 20.04 的服务器进行了验证,您可以按照此 Ubuntu 20.04 初始服务器设置教程来准备您的服务器。
  • MongoDB 安装在您的服务器上。 要进行此设置,请按照我们关于 如何在 Ubuntu 20.04 上安装 MongoDB 的教程进行操作。
  • 通过启用身份验证和创建管理用户来保护服务器的 MongoDB 实例。 要像这样保护 MongoDB,请按照我们关于 如何在 Ubuntu 20.04 上保护 MongoDB 的教程进行操作。

注意:有关如何配置服务器、安装和安全 MongoDB 安装的链接教程参考 Ubuntu 20.04。 本教程专注于 MongoDB 本身,而不是底层操作系统。 只要启用了身份验证,它通常适用于任何 MongoDB 安装,无论操作系统如何。


第 1 步 — 连接到 MongoDB 服务器

要打开 MongoDB shell,请在服务器提示符下运行 mongo 命令。 默认情况下,mongo 命令会打开一个 shell,该 shell 连接到在端口 27017 上运行的本地安装的 MongoDB 实例。

尝试运行不带附加参数的 mongo 命令:

mongo

这将打印一条欢迎消息,其中包含有关 shell 连接到的服务器的一些信息,以及安装的 MongoDB 版本。 以下示例表明 MongoDB 服务器在 MongoDB 默认端口 (27017) 上的 127.0.0.1(表示 localhost 的环回接口)上运行,并且运行版本为 4.4。 6

OutputMongoDB shell version v4.4.6
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("b9a48dc7-e821-4b09-a753-429eedf072c5") }
MongoDB server version: 4.4.6

在此消息下方,将出现 MongoDB shell 的提示符(由大于号表示):


尝试列出服务器上所有可用的数据库。 在 shell 提示符后键入 show dbs 并按 ENTER

show dbs

假设您遵循 如何保护 MongoDB 的先决条件教程,此命令不会返回任何输出。 这样做的原因是,即使 MongoDB 服务器正在运行并且 shell 能够连接到它,您也没有提供任何身份验证信息。 因此,您没有使用任何服务器数据库的访问权限,并且 show dbs 命令不返回任何内容。

键入以下命令退出 shell:

exit

Mongo shell 将打印一条简短的再见消息并将您返回到系统 shell:

Outputbye

注意:不键入 exit 命令,另一种关闭 shell 的方法是按 CTRL + C


现在尝试将 MongoDB shell 重新连接到数据库服务器,但这次提供用户名和密码以正确验证到您的 MongoDB 实例。 为此,您需要提供额外的命令行参数,如下例所示:

mongo -u AdminSammy -p --authenticationDatabase admin

该命令由几个部分组成:

  • -u:此标志设置用于向 MongoDB 服务器进行身份验证的用户名。 此示例指定在必备MongoDB安全教程AdminSammy中创建的管理用户。 对于本教程,您可以将其替换为您自己的管理用户的用户名(如果不同)。
  • -p:这个标志告诉 MongoDB shell 在连接数据库时使用密码。 按 ENTER 后,终端窗口会提示您输入密码。
  • --authenticationDatabase:此选项指定您登录的用户的身份验证数据库。 通常,管理帐户在 admin 数据库中进行管理,但如果您的用户的身份验证数据库不同,请输入该数据库来代替 admin

注意:要连接到运行在与 localhost 不同的机器上的 MongoDB 服务器,您可以在 shell 命令中添加 -h 标志,后跟服务器的 IP 地址。


输入安装过程中设置的密码,您将再次获得对 shell 的访问权限。

现在尝试再次执行 show dbs 命令:

show dbs

这一次,该命令将返回系统中所有可用数据库的列表:

Outputadmin   0.000GB
config  0.000GB
local   0.000GB

因为您已作为特权用户进行身份验证,所以 shell 将允许您在这些数据库中的任何一个上运行命令。

现在您已经使用 MongoDB shell 成功连接到 MongoDB 服务器,您可以继续学习如何在 shell 中执行命令。

第 2 步 — 执行命令

与其他命令行界面一样,MongoDB shell 接受命令并将所需的结果返回到标准输出。 如前所述,在 MongoDB shell 中,所有命令都输入到用大于号 (>) 表示的命令提示符中。 命令立即执行后按ENTER 并将命令输出返回到屏幕。

MongoDB 数据库中的大多数命令都在数据库或选定数据库中的集合上执行。 当前选择的数据库由可通过 shell 访问的 db 对象表示。 您可以通过在 shell 中键入 db 来检查当前选择了哪个数据库:

db

在新连接的 shell 实例上,所选数据库始终称为 test

Outputtest

您可以安全地使用此数据库来试验 MongoDB 和 MongoDB shell。 要切换到另一个数据库,您可以运行 use 命令,后跟新的数据库名称。 尝试切换到名为 fruits 的数据库:

use fruits

shell 将通知您现在正在使用新数据库:

Outputswitched to db fruits

您可以通过再次输入 db 来查找当前选定数据库的名称来验证这一点:

db

这一次,输出将反映新数据库:

Outputfruits

请注意,您尚未显式创建 fruits 数据库。 MongoDB 允许您在尚不存在的数据库和集合上运行命令; 它仅在第一次将对象插入其中时创建这些结构。 即使您已成功将当前数据库更改为 fruits,此数据库还不存在。

尝试通过向其中插入对象来创建此数据库。 以下示例概述了如何将对象插入数据库中名为 apples 的集合中。 通过添加此对象,该操作将创建 fruits 数据库和 apples 集合。

在 MongoDB shell 中键入以下行并按 ENTER。 注意突出显示的集合名称(apples):

db.apples.insert(

在左括号后按 ENTER 将启动多行命令提示符,允许您在多行中输入更长的命令。 在您输入右括号之前,insert 命令不会注册为完成。 在您这样做之前,提示将从大于号变为省略号 (...)。

您不需要像这样将 MongoDB 命令分成多行,但这样做可以使长命令更易于阅读和理解。

在下一行,在一对大括号内输入对象({})。 此示例文档只有一个字段和值对:

{name: 'Red Delicious'}

当您再次按下 ENTER 时,将显示另一行提示,允许您添加更多命令参数,如其他文档或 MongoDB 的插入方法 允许的任何规范。 但是,对于本例,您可以通过输入右括号并按 ENTER 来结束输入并运行操作:

)

这一次,Mongo shell 将注册 insert 命令的结尾并执行整个语句。

OutputWriteResult({ "nInserted" : 1 })

您可以在本系列的下一个教程 如何执行 CRUD 操作 中了解有关创建对象的更多信息。


将此新对象插入数据库后,fruits 数据库和 apples 集合都将存在。 使用 show dbs 命令检查可用数据库列表:

show dbs

同样,这将返回所有可用数据库的列表,但这次列表包括 fruits 数据库:

Outputadmin   0.000GB
config  0.000GB
fruits  0.000GB
local   0.000GB

要检索当前选定数据库中可用的集合列表,show collections 命令会派上用场:

show collections

由于选择了fruits数据库,所以只会返回新创建的apples集合:

Outputapples

至此,您已经了解了如何在 MongoDB shell 中执行命令。 您还创建了一个示例对象,该对象又创建了一个新数据库和一个新集合,该集合现在保存在服务器上。

在本指南的最后一步,您将学习如何调用 MongoDB shell 的帮助功能来更好地理解命令并更轻松地执行它们。

第 3 步 — 从 Shell 获取交互式帮助

MongoDB shell 有一个内置的帮助系统,您可以使用它来获取有关数据库系统可用命令和存储在其中的对象的信息。 可以直接在 shell 提示符下使用 help 命令访问此介绍性帮助屏幕:

help

MongoDB shell 将返回一个更详细的帮助条目列表,您可以使用它来了解 shell 的更具体部分,以及一些最常用命令的示例:

Output        db.help()                    help on db methods
        db.mycoll.help()             help on collection methods
        sh.help()                    sharding helpers
        rs.help()                    replica set helpers
        help admin                   administrative help
        help connect                 connecting to a db help
        help keys                    key shortcuts
        help misc                    misc things to know
        help mr                      mapreduce

        show dbs                     show database names
        show collections             show collections in current database
        show users                   show users in current database
        show profile                 show most recent system.profile entries with time >= 1ms
        show logs                    show the accessible logger names
        show log [name]              prints out the last segment of log in memory, 'global' is default
        use <db_name>                set current database
        db.mycoll.find()             list objects in collection mycoll
        db.mycoll.find( { a : 1 } )  list objects in mycoll where a == 1
        it                           result of the last line evaluated; use to further iterate
        DBQuery.shellBatchSize = x   set default number of items to display on shell
        exit                         quit the mongo shell

此示例输出中突出显示的前两个条目分别说明了如何为当前数据库和当前数据库中的集合执行 help 命令。 给出的示例集合名称是 mycoll,但可以使用任何有效的集合名称。

最后突出显示的行 - db.mycoll.find() - 是使用 find 命令从集合中检索对象的一种方法示例,该命令列出给定集合中的对象。 因为集合是 Mongo 数据库中一些最常用的结构,这一步将介绍如何使用 Mongo 的 find()help() 集合级方法。

首先,访问 apples 集合的帮助屏幕以查找可用于此集合的命令:

db.apples.help()

注意: 虽然最初的帮助命令只是 help,但在对数据库和集合对象执行 帮助方法 时,您必须在命令后面加上一对括号,以便读作 help() 而不仅仅是 help


此命令的输出将是您可以在 apples 集合上执行的可用命令的冗长列表:

OutputDBCollection help
        db.apples.find().help() - show DBCursor help
        db.apples.bulkWrite( operations, <optional params> ) - bulk execute write operations, optional parameters are: w, wtimeout, j
        db.apples.count( query = {}, <optional params> ) - count the number of documents that matches the query, optional parameters are: limit, skip, hint, maxTimeMS
        db.apples.countDocuments( query = {}, <optional params> ) - count the number of documents that matches the query, optional parameters are: limit, skip, hint, maxTimeMS
. . .
        db.apples.find([query],[fields]) - query is an optional query filter. fields is optional set of fields to return.
                                                      e.g. db.apples.find( {x:77} , {name:1, x:1} )
        db.apples.find(...).count()
        db.apples.find(...).limit(n)
        db.apples.find(...).skip(n)
        db.apples.find(...).sort(...)
. . .

除了您可以在 db.apples 集合上执行的可用命令的纯列表(每个命令后面都有给定命令作用的简短描述),此帮助屏幕还提供了常用命令的用法示例例如 find()

这个捆绑的帮助系统可作为可用命令的有用参考。 如果您不记得确切的拼写或命令的可接受字段,您可以使用它来检查您的语法。

由于您已经从帮助屏幕中了解到 find() 可用于从集合中检索对象,因此您现在可以尝试检索您在上一步中在 apples 集合中创建的对象。

但是,此示例将突出显示 MongoDB 的另一个交互式帮助辅助工具,称为 命令完成 。 MongoDB shell 遵循其他流行 shell 中的模式,例如 Bashzsh,其中按下键盘的 TAB 键将自动完成您正在执行的任何命令打字。

首先键入以下内容,但 尚未按 ENTER

db.a

不要输入完整的集合名称,而是按键盘上的 TAB 键。 MongoDB shell 将响应以 a 开头的所有可用可能性的列表:

Output> db.a
db.adminCommand(  db.aggregate(     db.apples         db.auth(

此输出列出了三个命令,用左括号表示,以及 apples 集合。

在 shell 中再输入一个字母:

db.ap

再按一次 TAB。 这一次,没有其他以ap开头的可能性,MongoDB shell会自动完成输入并为你输入db.apples。 按照同样的原则,使用TAB补全完成find()命令。 键入 fi不要按 ENTER

db.apples.fi

TAB 将自动将命令名称补全为 db.apples.find。 此时,再次按下 TAB 将导致 shell 列出更多可能性,但您可以手动添加右括号来执行 find 命令:

db.apples.find()

shell 将显示在 apples 集合中找到的所有对象的列表。 将只有一个对象,即您之前插入的对象:

Output{ "_id" : ObjectId("60f31447f5643f739b0276e9"), "name" : "Red Delicious" }

此示例使用对象创建和检索命令来说明如何使用交互式 shell。 您可以在本系列的下一个教程 如何执行 CRUD 操作 中了解有关使用数据库对象的更多信息。


这样,您就学会了如何使用内置帮助系统和 Mongo shell 的自动完成功能。

结论

通过阅读本文,您将熟悉 MongoDB shell。 Shell 可以将新对象插入数据库、查询现有集合以及执行管理任务以管理数据库、其数据和用户。

MongoDB shell 公开了对 Mongo 的大部分功能的直接访问,例如数据库和集合对象和方法,使其成为与数据库服务器交互的主要工具。 但是,在以编程方式使用 MongoDB 时,可以通过 MongoDB shell 脚本或通过 驱动程序 使用相同的函数和方法集,MongoDB 已为许多编程语言提供。

您可以按照本教程中描述的原则在 MongoDB shell 中执行本系列其他文章中的命令。 我们鼓励您在 官方 MongoDB 文档 中了解有关 MongoDB Shell 的更多信息。