如何使用 MongoDB Shell

作者选择了 开放式互联网 / 自由言论基金作为 写给捐赠计划的一部分接受捐款。

介绍

MongoDB 等数据库系统通常与连接到数据库服务器并执行操作的外部应用程序一起使用,例如读取和处理数据或写新条目。

MongoDB shell 是您可以使用的交互式控制台连接到数据库服务器并在其上执行命令,允许您执行管理任务并直接阅读、写入或操纵数据。

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

前提条件

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

  • 一个拥有sudo特权和与 UFW 配置的防火墙的常规非根用户的服务器. 本教程是通过使用运行 Ubuntu 20.04 的服务器进行验证的,您可以通过遵循此(Ubuntu 20.04 的初始服务器设置教程)来准备您的服务器。
  • MongoDB 安装在您的服务器上。 要设置此功能,请遵循我们的教程(How to Install MongoDB on Ubuntu 20.04)(https://andsky.com/tech/tutorials/how-to-install-mongodb-on-ubuntu-20-04)。
  • 您的服务器的 MongoDB 实例通过启用身份验证和创建一个管理用户进行安全。 为了确保 MongoDB 像这样,请遵循我们的教程(How To Secure MongoDB on Ubuntu 20.04)(https://andsky.com/tech/tutorials/how-to-secure-mongodb-on-ubuntu-20-04)。

<$>[注] **注:**有关如何配置服务器,安装,然后安全MongoDB安装的链接教程参考Ubuntu 20.04.本教程专注于MongoDB本身,而不是潜在的操作系统。

步骤 1 – 连接到 MongoDB 服务器

要打开 MongoDB 壳,请从您的服务器提示程序运行mongo命令. 默认情况下,mongo命令会打开连接到运行在端口27017的本地安装的 MongoDB 实例的壳。

尝试运行mongo命令,没有额外的参数:

1mongo

这将打印一个欢迎消息,其中包含一些关于壳连接到的服务器的信息,以及安装了哪个版本的 MongoDB。下面的示例表明,MongoDB 服务器在 MongoDB 的默认端口(27017)上运行在 127.0.0.1 (一个代表 localhost 的 loopback 接口) 和运行版本 4.4.6。

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

在此消息下方,MongoDB壳的提示 - 由大于符号表示 - 将显示:

尝试列出服务器上所有可用的数据库,在壳提示后输入显示dbs,然后按ENTER:

1show dbs

假设你遵循了 How To Secure MongoDB上的前提教程,这个命令不会返回任何输出. 原因是,尽管MongoDB服务器正在运行,壳可以连接到它,但你没有提供任何身份验证信息。

通过键入输出 shell:

1exit

蒙古壳将打印一个短暂的告别消息,并将您返回系统壳:

1[secondary_label Output]
2bye

<$>[注意] 注意:而不是输入退出命令,另一种关闭壳的方法是按CTRL + C

现在尝试将 MongoDB 壳重新连接到数据库服务器,但这次请提供用户名和密码,以便正确验证您的 MongoDB 实例。

1mongo -u AdminSammy -p --authenticationDatabase admin

这个命令由几个部分组成:

  • u:这个标志将用于验证 MongoDB 服务器的用户名设置在 MongoDB 服务器中。本示例指定了在 前提 MongoDB 安全教程, AdminSammy中创建的管理用户。对于本教程,您可以用您自己的管理用户的用户名替换,如果不同的话。
  • -p:这个标志告诉 MongoDB 壳在连接到数据库时使用密码。在您点击ENTER后,您将被要求在终端窗口中提供密码。
  • --authenticationDatabase’:此选项指定了您登录的用户的身份验证数据库。 通常,管理帐户在admin`数据库中被管理,

<$>[注] :要连接到运行在 localhost 以外的机器上的 MongoDB 服务器,您可以将-h 旗,然后是您的服务器的 IP 地址添加到壳命令中。

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

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

1show dbs

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

1[secondary_label Output]
2admin 0.000GB
3config 0.000GB
4local 0.000GB

由于您已作为特权用户验证,壳将允许您在这些数据库中的任何一个运行命令。

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

步骤二:执行命令

与其他命令行接口一样,MongoDB shell接受命令并将所需结果返回到标准输出中,如前所述,在MongoDB shell中,所有命令都输入到命令提示中,标记为大于字符(>)。

MongoDB 数据库中的大多数命令都是在选定的数据库中的数据库或集合上执行的。当前选定的数据库是由可通过壳访问的 db 对象表示的。

1db

在新连接的壳实例中,所选择的数据库总是被称为测试:

1[secondary_label Output]
2test

您可以安全地使用此数据库来实验 MongoDB 和 MongoDB 壳. 要切换到另一个数据库,您可以运行使用命令,然后是新的数据库名称。

1use fruits

壳将告知您现在正在使用新数据库:

1[secondary_label Output]
2switched to db fruits

您可以通过再次键入db来验证此情况,以查找当前选择的数据库名称:

1db

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

1[secondary_label Output]
2fruits

请注意,您没有明确创建水果数据库。MongoDB允许您在尚不存在的数据库和集合上运行命令;它只在先插入对象时创建这些结构。

下面的示例描述了如何将一个对象插入名为苹果的数据库中的集合。

在 MongoDB 壳中输入以下行,然后按ENTER

1db.apples.insert(

打开组合后按ENTER将启动一个多行命令提示,允许您在多个行中输入更长的命令。在您输入一个关闭组合之前,插入命令将不会注册为完整。

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

在下一行中,将对象输入到一对弯曲的支架({})中。

1{name: 'Red Delicious'}

当您再次按ENTER时,会显示另一个线索提示,允许您添加其他命令参数,如其他文档或任何MongoDB的插入方法所允许的规格(https://docs.mongodb.com/manual/reference/method/db.collection.insert/)。

1)

这一次,蒙古壳将记录插入命令的结尾并执行整个陈述。

1[secondary_label Output]
2WriteResult({ "nInserted" : 1 })

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

将此新对象插入数据库后,将存在水果数据库和苹果集合。

1show dbs

这再次返回了所有可用的数据库的列表,但这次列表包括水果数据库:

1[secondary_label Output]
2admin 0.000GB
3config 0.000GB
4fruits 0.000GB
5local 0.000GB

若要获取当前选择的数据库中可用的集合列表,请使用显示集合命令:

1show collections

由于选择了水果数据库,它只会返回新创建的苹果收藏:

1[secondary_label Output]
2apples

您还创建了一个样本对象,该对象反过来创建了一个新的数据库和一个新的集合,现在仍然存在于服务器上。

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

步骤 3 – 从壳获得互动帮助

MongoDB 壳具有内置的帮助系统,您可以使用它来获取有关数据库系统可用的命令和存储在其中的对象的信息。

1help

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

 1[secondary_label Output]
 2        db.help()                    help on db methods
 3        db.mycoll.help()             help on collection methods
 4        sh.help()                    sharding helpers
 5        rs.help()                    replica set helpers
 6        help admin administrative help
 7        help connect connecting to a db help
 8        help keys key shortcuts
 9        help misc misc things to know
10        help mr mapreduce
11
12        show dbs show database names
13        show collections show collections in current database
14        show users show users in current database
15        show profile show most recent system.profile entries with time >= 1ms
16        show logs show the accessible logger names
17        show log [name]              prints out the last segment of log in memory, 'global' is default
18        use <db_name>                set current database
19        db.mycoll.find()             list objects in collection mycoll
20        db.mycoll.find( { a : 1 } )  list objects in mycoll where a == 1
21        it result of the last line evaluated; use to further iterate
22        DBQuery.shellBatchSize = x set default number of items to display on shell
23        exit quit the mongo shell

在本示例输出中突出的前两个条目说明了如何对当前数据库和当前数据库中的集合执行帮助命令。

最后一个突出的一行 - db.mycoll.find() - 是使用 find 命令从集合中获取对象的一种方法的一个例子,该命令列出了特定集合中的对象. 由于集合是 Mongo 数据库中最常用的结构之一,此步骤将讨论如何使用 Mongo 的 find()help() 集合级别的方法。

首先,访问苹果集合的帮助屏幕,以查找该集合的可用命令:

1db.apples.help()

<$>[注] **注:**虽然最初的帮助命令只是帮助,但在数据库和收集对象上执行 help method 时,您必须按照命令用一对子来读取帮助(),而不是仅仅是帮助

此命令的输出将是您可以在苹果集合中执行的可用命令的长列表:

 1[secondary_label Output]
 2DBCollection help
 3        db.apples.find().help() - show DBCursor help
 4        db.apples.bulkWrite( operations, <optional params> ) - bulk execute write operations, optional parameters are: w, wtimeout, j
 5        db.apples.count( query = {}, <optional params> ) - count the number of documents that matches the query, optional parameters are: limit, skip, hint, maxTimeMS
 6        db.apples.countDocuments( query = {}, <optional params> ) - count the number of documents that matches the query, optional parameters are: limit, skip, hint, maxTimeMS
 7. . .
 8        db.apples.find([query],[fields]) - query is an optional query filter. fields is optional set of fields to return.
 9                                                      e.g. db.apples.find( {x:77} , {name:1, x:1} )
10        db.apples.find(...).count()
11        db.apples.find(...).limit(n)
12        db.apples.find(...).skip(n)
13        db.apples.find(...).sort(...)
14. . .

除了在「db.apples」集合中可以执行的可用命令的纯粹列表之外(每个命令都随后简要描述了该命令所做的事情),此帮助屏幕还为常用的命令提供使用示例,例如「find()」。

此组合的帮助系统可作为可用的命令引用,您可以使用它来检查您的语法,如果您不记得命令的准确拼写或可接受的字段。

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

然而,这个例子将突出 MongoDB 的另一个交互式帮助工具,称为 command completion. MongoDB 壳遵循其他流行的壳中发现的模式,如Bashzsh,在其中按下键盘的TAB键将自动完成您在键入过程中所做的任何命令。

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

1db.a

代替在键盘上键入完整的集合名称,请按下键盘上的TAB键,MongoDB壳将以a开头的所有可用可能性列表响应:

1[secondary_label Output]
2> db.a
3db.adminCommand(  db.aggregate(     db.apples db.auth(

此输出列出了三个命令,标示着一个开关,以及苹果集合。

在壳中输入另一个字母:

1db.ap

再次点击TAB。这次,没有其他可能性,从ap开始,MongoDB壳将自动完成输入并为您键入db.apples。 遵循相同的原则,并使用TAB完成完成find()命令。

1db.apples.fi

TAB将自动完成命令名称为db.apples.find。在此时,再次按TAB会导致壳列出进一步的可能性,但您可以手动添加一个关闭方针来执行find命令:

1db.apples.find()

壳将显示在苹果集合中发现的所有对象的列表,只有一个对象,你之前插入的对象:

1[secondary_label Output]
2{ "_id" : ObjectId("60f31447f5643f739b0276e9"), "name" : "Red Delicious" }

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

有了它,你已经学会了如何使用内置的帮助系统和Mongo壳的自动完成功能。

结论

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

MongoDB 壳可以直接访问 MongoDB 的大多数功能,例如数据库和收集对象和方法,使其成为与数据库服务器互动的主要工具,但是,当与 MongoDB 编程时,可以使用相同的函数和方法,无论是通过 MongoDB 壳脚本或通过 MongoDB 已为许多编程语言提供的驱动程序。

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

Published At
Categories with 技术
Tagged with
comments powered by Disqus