MongoDB Shell mongosh
1、MongoDB Shell的安装
在Windows操作系统中,安装MongoDB 6.0之前的版本时,bin目录下会多出一个mongo.exe文件。该文件用于连接到MongoDB服务,是一个基于Shell环境的客户端工具。而在MongoDB 6.0及之后的版本中,需要单独安装MongoDB Shell,文件的名称也发生了变化,从mongo改为mongosh。因此,后面的内容中,mongosh与MongoDB Shell表示同一含义。
MongoDB Shell(即mongosh)能够连接MongoDB 4.2及以上版本。目前MongoDB Shell最新的版本为2.1.1,此版本能够支持的操作系统版本如表所示。

1.1、在Windows系统上安装MongoDB Shell
首先下载MongoDB Shell文件,下载地址为https://www.mongodb.com/try/download/shell,页面如图所示。

下载完成后,双击运行安装包,进入安装向导,如图所示。

修改安装目录,改为D盘,如图所示。后面均使用默认设置,每一步直接单击Next按钮进入下一步,直到安装完成。

安装完成后,查看安装目录,如图所示。

然后打开命令行窗口,进入安装目录,执行mongosh.exe,默认会连接mongodb://localhost:27017的MongoDB服务,如图所示。

安装完成后,配置环境变量。首先创建MONGOSH_HOME的系统变量,如图所示。

然后编辑环境变量Path,在最后加入一行内容:
%MONGOSH_HOME%
最终结果如图所示。

1.2、在Linux系统上安装MongoDB Shell
与Windows系统不同,在Linux系统上安装MongoDB时会同步安装MongoDB Shell(即mongosh),无须重复安装。已安装mongosh的系统,再次安装会提示如图所示的内容。

如果未安装,可以使用.deb、.rpm、.tgz等方式进行安装。这里选择使用在线rpm方式进行安装。
首先创建/etc/yum.repos.d/mongodb-org-8.0.repo文件。前面讲解在Linux系统上安装MongoDB时已创建了该文件,该文件的内容可参考2.2节,如果没有该文件,按照2.2节讲解的步骤创建即可。该文件创建完成后,执行如下安装命令:
sudo yum install -y mongodb-mongosh
mongosh支持OpenSSL。如果没有特别指定,安装时会直接使用内置的OpenSSL包。该命令会直接安装mongosh最新的稳定版本。
2、MongoDB Shell的配置
2.1、使用命令编辑器
MongoDB Shell(mongosh)是面向行的,所以当所使用的命令涉及多行时,可以使用编辑器来处理多行函数,例如插入多条数据等。编辑器的使用有以下两种方式:
- 使用外部编辑器与edit命令。
- 使用内置编辑器与.editor命令。
2.1.1、使用外部编辑器与edit命令
首先配置外部编辑器,在Linux系统上可以配置vi编辑器,命令如下:
config.set( "editor", "vi" )
# 或
export EDITOR=nano
# 或
export EDITOR=vim
# 然后
source ~/.bashrc
# 或
source ~/.zshrc
执行成功的结果如图所示。

配置完成后,可以使用edit命令编辑多行命令。例如插入多条数据,命令如下:
edit db.authors.insertMany( [] )
编辑完成后,退出编辑器,mongosh会自动转换为如下格式:
test> db.authors.insertMany([{ "name": "李白" }, { "name": "杜甫" }, { "name":
"贾岛" }])
结果如图所示。

除使用mongosh的editor属性来配置外部编辑器外,也可以通过EDITOR环境变量来配置,有两种设置方式,命令如下:
export EDITOR=vi #在Linux系统命令中使用
process.env.EDITOR = 'vi' #在mongosh中设置
mongosh的editor属性优先级高于环境变量。
如果想取消以上关于外部编辑器的设置,可以在mongosh中使用如下命令之一:
config.set("editor", null)
process.env.EDITOR = ' '
2.1.2、使用内置编辑器与.editor命令
.editor命令提供了编辑多行命令的功能。这个内置编辑器不会保存代码,当编辑器被关闭时,所编辑的内容会被加载到全局范围内,然后执行。
使用如下命令开启内置编辑器:
.editor
开启内置编辑器后如图所示。

当输入内容完成后,使用Ctrl+D键保存并执行内容,使用Ctrl+C键取消操作。
使用内置编辑器插入多行数据,输入完成后,按Ctrl+D键,如图所示。从图中可以看到,3条数据已被成功插入。

2.2、配置设置
MongoDB Shell提供了多项配置,使得用户在使用过程中操作更加高效,更符合用户的使用习惯。
MongoDB Shell能够配置的属性如表所示。

2.2.1、使用API配置
使用config命令配置或者查询配置信息,语法格式如下:
config.get( "<property>" )
config.set( "<property>", <value> )
config.reset( "<property>" )
上表中列举的属性都可以通过API来配置。
在mongosh未启动时,同样可以调用config命令进行配置,通过–eval选项设置即可。命令如下:
mongosh --nodb --eval 'config.set("enableTelemetry", true)'
配置完成之后,结果如图所示。

2.2.2、使用配置文件配置
除使用上述API方式外,还可以只用全局配置文件来配置。配置文件的格式为YAML。所有可配置的属性均在mongosh命名空间下。例如:

在不同的操作系统下,该配置文件的格式(扩展名)不同,且存储目录也不相同。下表给出了3种操作系统中配置文件的目录及格式。

注意:使用API配置之后的属性值会覆盖掉配置文件中设置的值。
2.3、自定义mongosh提示
默认情况下mongosh提示语(在命令左侧显示)为当前数据库的名称。可以通过修改prompt变量来修改该配置,这种修改方式不会持久保存,一旦退出mongosh,该自定义修改也会消失。想要永久修改该配置,可以通过修改.mongoshrc.js文件来实现。
2.3.1、显示命令行数
将提示语改为命令行数,可以在mongosh中运行如下命令:

执行时可以使用外部编辑器,也可以使用内部编辑器,如图所示。从图中可以看出,前面的提示语从当前数据库名称变成了命令行数。

2.3.2、显示数据库和域名
在mongosh提示语中加上域名,需要使用如下函数:

在编辑器中修改后执行函数,如图所示。从图中可以看到,上一步设置的显示行数已经取消,已修改为显示当前数据库名称以及域名信息。

2.3.3、显示系统启动时间和文档计数
将提示语改为系统启动时间以及当前数据库中的所有文档数,函数内容如下。

在编辑器中修改后执行函数,如图所示。从图中可以看出,提示语已从上一步的数据库名称和域名修改为系统启动时间以及当前数据的文档数。系统启动时间为实例连续正常运行时间,单位是秒。

2.4、配置远程数据搜集
mongosh会搜集远程匿名数据用于优化MongoDB产品。默认情况下,该设置是启用的,使用者可以随时关闭该设置。
2.4.1、搜集的信息
mongosh搜集的数据包括以下内容。
- mongosh连接的MongoDB类型:例如,企业版、社区版或云部署Atlas版。
- mongosh中运行的方法:mongosh只跟踪方法的名称,不跟踪提供给方法的任何参数。
- 用户是否使用mongosh运行脚本。
- 错误信息。
以下内容mongosh不会搜集:
- IP地址、主机名、用户名或凭据。
- 在mongosh中运行的查询。
- 存储在MongoDB部署中的任何数据。
- 个人身份信息。
2.4.2、切换配置
使用者可以通过如下命令禁用该配置,关闭mongosh的信息搜集:
disableTelemetry()
设置完成后的提示如图所示。

除在mongosh中设置外,也可以在mongosh启动时,通过–eval选项指定该配置,命令如下:
mongosh --nodb --eval "disableTelemetry()"
当需要启动该配置时,可以使用如下命令:
enableTelemetry()
3、MongoDB Shell的运行命令
MongoDB Shell会自动格式化数据的输入和输出,mongosh命令使用Node.js BSON解析器来解析BJSON数据。
3.1、切换数据库
使用db命令查询当前所使用的数据,默认使用test数据库。
切换数据库时,可以使用use命令,如下所示:
use <database>
查询当前用户可用的数据库,使用show dbs命令。
show dbs
3.2、创建数据库和集合
当数据库不存在时,使用use命令可以创建不存在的数据库。当集合不存在时,使用插入命令,可以直接创建集合并插入数据。
use reading
db.poetry.insertOne( { title: "将进酒"} );
执行结果如图所示。

3.3、终止命令
当命令或查询正在运行时,使用Ctrl+C键可以终止操作。当按键按下后,mongosh会中断正在执行的命令,尝试终止服务端的操作,并返回关于该命令的提示信息。
如果连续按下两次Ctrl+C键,会退出当前的mongosh客户端。
3.4、清空控制台
当控制台输出内容较多,需要清空时,可以使用如下3种方式清空内容:
- cls命令。
- Ctrl+L键。
- console.clear()。
4、使用MongoDB Shell进行简单操作
一般情况下,数据库支持命令以及图形化等多种方式来操作数据。在使用命令操作数据库时,MongoDB Shell非常强大。只要版本适配,它就能够支持MongoDB提供的所有方法。在使用数据库的过程中,最常用的就是对数据的增删改查,即新增、删除、修改和查询操作。
4.1、新增
通过MongoDB Shell可以使用如下方法实现文档记录的插入操作。
- 插入单条文档:
db.collection.insertOne()。 - 插入多条文档:
db.collection.insertMany()。
4.1.1、插入单条文档
使用db.collection.insertOne()插入单条文档数据,如果数据中未指定_id字段的值,MongoDB就会自动添加该字段的值。语句如下:
db.books.insertOne({ title: "兄弟", genres: ["Novel", "Fiction"], words: 500000, year: 2005, author: ["余华"], characters: ["李光头", "宋钢", "宋平凡", "林红"], country: "中国" })
执行结果如图所示。从图中可以看到,数据插入成功之后,会返回该条记录的_id值。

4.1.2、插入多条文档
插入多条文档的语句如下:

执行结果如图所示。从图中可以看出,插入多条文档后,会返回每一条数据的_id字段值。

4.2、查询
查询文档数据使用命令db.collection.find(),该命令会返回集合中的所有文档,如图所示。

该语句跟下面的SQL语句作用相同:
SELECT * FROM books
除查询全部文档外,还可以使用命令<field>:<value>指定字段值来过滤文档。例如,查询书名为《活着》的书,命令如下:
db.books.find({ "title": "活着" })
该条语句等同于如下SQL语句:
SELECT * FROM books WHERE title = "活着"
除此之外,还可以使用查询操作符来查询数据,语法如下:
{ <field1>: { <operator1>: <value1> }, ... }
查询1986年和1992年发表的作品,命令如下:
db.books.find({year: { $in: [ 1986, 1992] } } )
执行结果如图所示。

该条语句等同于如下SQL语句:
SELECT * FROM b WHERE year in (1986, 1992)
使用逻辑运算符查询数据,$gte表示大于,例如查找2000年以后发表的作品,命令如下:
db.books.find({ country: "中国", "year": { $gte: 2000 } })
默认情况下,语句中的条件是and,即“且”的关系。如果使用“或”关系,可在语句中加入$or关键字。例如查询属于中国的且字数在60万字以上或者在2005年发表的作品。命令如下:

执行结果如图所示。$or关键字标记的语句属于或的关系,整个$or与外面的country查询条件构成“且”的关系。

4.3、修改
MongoDB Shell提供如下有关修改的操作语句:
db.collection.updateOne()。db.collection.updateMany()。db.collection.replaceOne()。
4.3.1、更新操作符
更新操作符的语法格式如下:

4.3.2、更新单个文档
使用db.collection.updateOne()更新单个文档。默认情况下,MongoDB会更新符合查询条件结果集的第一条文档。
例如,更新书名为《活着》的作品简介,并记录更新时间,语句如下:
db.books.updateOne(
{title: "活着"},
{
$set: {
plot: "讲解一个人一生的故事,这是一个历经世态沧桑和磨难老人的人生感言,是一幕演绎人生苦难经历的戏剧。"
},
$currentDate: {lastUpdated: true}
}
)
执行结果如图所示。

此条语句中用到了$set操作符,更新了plot字段值。$currentDate操作符更新了lastUpdated字段值。如果以上字段不存在,操作符会自动创建相应的字段并赋值。数据成功更新后,执行查询语句查看该条文档数据,可以看到plot和lastUpdated字段,如图所示。

4.3.3、更新多个文档
使用db.collection.updateMany()更新多个文档,该语句会更新满足查询条件的结果集的所有文档。例如,给字数在10万字以上的书加上标签“长篇”,语句如下:

执行结果如图所示。

从上图中可以看到,matchedCount为3,表示匹配的记录有3条,modifiedCount为3,表示被更新的记录有3条。
更新成功后,查询对应数据,可以看到数据已成功更新,如下图所示。

4.3.4、替换单个文档
使用语句db.collection.replaceOne()替换符合查询条件的结果集的第一个文档。例如将《兄弟》这本书的内容全部修改为《在细雨中呐喊》的内容。语句如下:

执行结果如图所示。

替换语句不会操作_id字段,所以在更新的内容中可以忽略该字段,如果在更新语句中有_id字段的值,确保与要替换的文档记录的_id字段值一致。替换成功后,执行查询语句,如图所示。从图中可以看到书的信息已被替换,但_id字段未发生改变。

4.4、删除
删除的语法格式如下:
db.collection.deleteOne()。db.collection.deleteMany()。
4.4.1、删除所有数据
db.books.deleteMany({})
此条语句慎用,会删除集合的全部文档数据。
4.4.2、删除满足条件的所有文档
删除书名为《平凡的世界》的作品,命令如下:
db.books.deleteMany({ title: "平凡的世界" })
执行结果如图所示。

删除完成后,执行查询语句,如图所示。

4.4.3、删除满足条件的单个文档
删除作者“余华”的其中一本书,语句如下:
db.books.deleteOne({ author: "余华" })
执行结果如图所示。

删除满足条件的单个文档删除完成后,执行查询语句,如图所示。

5、客户端字段级加密
字段级加密仅支持在Atlas和企业版中使用,社区版不支持该功能。字段级加密支持以下几种方式:
- 亚马逊网络服务KMS。
- Azure密钥保管库。
- 谷歌云平台KMS。
- 本地管理的密钥文件。
这里我们选择本地管理的密钥文件来讲解字段级加密的过程。
步骤1:创建数据加密key。首先以无数据库状态启动mongosh,使用–nodb选项,命令如下:
mongosh --nodb
步骤2:创建加密key,指定使用Base64加密方式的96字节字符串,命令如下:
crypto.randomBytes(96).toString('base64')
此命令会生成一个key,用于后续配置,如图所示。

配置加密变量。创建新的变量autoEncryptionOpts,用来存储加密配置。命令如下:

MY_LOCAL_KEY变量内容需要替换成上一步生成的key。
步骤3:使用Mongo()函数创建数据库连接。将上一步设定的变量autoEncryptionOpts作为第二个参数传递到该函数中,命令如下:

步骤4:使用getKeyVault()主函数创建keyVault变量,命令如下:
keyVault = csfleDatabaseConnection.getKeyVault();
步骤5:使用createKey()函数创建数据加密key,命令如下:

- 第一个参数:设置为local,指定配置的本地托管密钥。
- 第二个参数:设置密钥备用名称,为数组类型。每个备用名称必须是唯一的。getKeyVault()方法为备用名称创建了索引,以确保字段的唯一性。
执行成功后,会返回数据加密key的UUID。
查询该key可以使用以下方法。
getKey():以UUID查询key。getKeyByAltName():如果指定了备用名称,则使用名称查询key。
6、脚本
MongoDB Shell支持运行脚本来修改数据或其他操作。脚本操作支持以下MongoDB版本:
- MongoDB Atlas。
- MongoDB Enterprise。
- MongoDB Community。
6.1、运行JavaScript脚本
6.1.1、在MongoDB Shell中运行JS脚本
在MongoDB Shell中可以使用load()方法执行JavaScript脚本文件。运行时支持加载脚本文件的相对路径或绝对路径。例如,MongoDB Shell在/data/db目录下,脚本文件insert.js在/data/db/scripts文件夹下,那么以下命令均可以成功加载该脚本:
load( "scripts/connect-and-insert.js" )
load( "/data/db/scripts/connect-and-insert.js" )
例如,在/data/db/scripts目录下创建一个脚本文件connect-and-insert.js,向数据库reading中的books集合插入几条数据。脚本内容如下:
db = connect('mongodb://127.0.0.1/reading');
db.books.insertMany([
{
title: '三国演义',
genres: ['Novel'],
author: ['罗贯中']
},
{
title: '史记',
genres: ['History'],
author: ['司马迁']
},
{
title: '左传',
genres: ['History'],
author: ['左丘明']
}
])
创建完成后,连接mongosh执行该脚本,成功执行后返回结果为true,并自动切换到reading数据库,如图所示。

然后执行查询操作。查询结果如图所示。从图中可以看到,数据已成功插入。

6.1.2、在操作系统命令行中运行JS脚本
在操作系统命令行中运行JS脚本,需要用到–file或-f选项。同样是上面的示例,使用命令行重新插入。插入脚本可直接延用上面的connect-and-insert.js。除此之外,新建query.js脚本用来查询数据库,与插入脚本一同放入/data/db/scripts目录下。查询脚本内容如下:
db = connect( 'mongodb://localhost/reading');
printjson( db.books.find( {} ) );
首先进入系统命令行,为避免命令过长,将当前命令行切换到/data/db/scripts目录下,切换后同时执行插入和查询脚本,命令如下:
mongosh --file connect-and-insert.js --file query.js
执行结果如图所示。

除使用命令行连接本地MongoDB运行脚本外,还可以加入授权信息连接远程的MongoDB,命令如下:

6.2、运行配置文件中的代码
启动时,mongosh会到家目录(当前用户的主目录)下查找一个名为.mongoshrc.js的文件,如果找到该文件,mongosh会在首次出现提示语前读取文件内容。
家目录是当前系统登录用户的主目录,家目录的查找方法如下:
对于Linux系统,输入cd~进入家目录,然后输入pwd显示文件路径,如图所示。

对于Windows系统,打开资源管理器,输入%homepath%,按Enter键确定,跳转的目录即为当前用户的家目录,如图所示。

下面使用JS配置文件来修改mongosh的提示语,在mongosh的主目录下创建名为.mongoshrc.js文件,文件内容如下:

这样就会修改mongosh的提示语为行命令数。
除JS代码外,mongosh还能加载MongoDB代码,向.mongoshrc.js文件中加入如下内容:
db.clientConnections.insertOne({ connectTime: ISODate() })
这样每次启动mongosh连接数据库时,都会生成日志记录。日志记录内容如下:

.mongoshrc.js文件还支持将JS代码和MongoDB代码两者混合。

连接mongosh后可以看到如下提示:
test@localhost.localdomain>

3724

被折叠的 条评论
为什么被折叠?



