MongoDB 8.0——MongoDB Shell(mongosh)

发布时间:2026/8/1 20:31:41
MongoDB 8.0——MongoDB Shell(mongosh) MongoDB Shell mongosh1、MongoDB Shell的安装1.1、在Windows系统上安装MongoDB Shell1.2、在Linux系统上安装MongoDB Shell2、MongoDB Shell的配置2.1、使用命令编辑器2.1.1、使用外部编辑器与edit命令2.1.2、使用内置编辑器与.editor命令2.2、配置设置2.2.1、使用API配置2.2.2、使用配置文件配置2.3、自定义mongosh提示2.3.1、显示命令行数2.3.2、显示数据库和域名2.3.3、显示系统启动时间和文档计数2.4、配置远程数据搜集2.4.1、搜集的信息2.4.2、切换配置3、MongoDB Shell的运行命令3.1、切换数据库3.2、创建数据库和集合3.3、终止命令3.4、清空控制台4、使用MongoDB Shell进行简单操作4.1、新增4.1.1、插入单条文档4.1.2、插入多条文档4.2、查询4.3、修改4.3.1、更新操作符4.3.2、更新单个文档4.3.3、更新多个文档4.3.4、替换单个文档4.4、删除4.4.1、删除所有数据4.4.2、删除满足条件的所有文档4.4.3、删除满足条件的单个文档5、客户端字段级加密6、脚本6.1、运行JavaScript脚本6.1.1、在MongoDB Shell中运行JS脚本6.1.2、在操作系统命令行中运行JS脚本6.2、运行配置文件中的代码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节讲解的步骤创建即可。该文件创建完成后执行如下安装命令sudoyuminstall-ymongodb-mongoshmongosh支持OpenSSL。如果没有特别指定安装时会直接使用内置的OpenSSL包。该命令会直接安装mongosh最新的稳定版本。2、MongoDB Shell的配置2.1、使用命令编辑器MongoDB Shell(mongosh)是面向行的所以当所使用的命令涉及多行时可以使用编辑器来处理多行函数例如插入多条数据等。编辑器的使用有以下两种方式使用外部编辑器与edit命令。使用内置编辑器与.editor命令。2.1.1、使用外部编辑器与edit命令首先配置外部编辑器在Linux系统上可以配置vi编辑器命令如下config.set(editor,vi)# 或exportEDITORnano# 或exportEDITORvim# 然后source~/.bashrc# 或source~/.zshrc执行成功的结果如图所示。配置完成后可以使用edit命令编辑多行命令。例如插入多条数据命令如下edit db.authors.insertMany([])编辑完成后退出编辑器mongosh会自动转换为如下格式testdb.authors.insertMany[{name:李白},{name:杜甫},{name:贾岛}]结果如图所示。除使用mongosh的editor属性来配置外部编辑器外也可以通过EDITOR环境变量来配置有两种设置方式命令如下exportEDITORvi#在Linux系统命令中使用process.env.EDITORvi#在mongosh中设置mongosh的editor属性优先级高于环境变量。如果想取消以上关于外部编辑器的设置可以在mongosh中使用如下命令之一config.set(editor,null)process.env.EDITOR 2.1.2、使用内置编辑器与.editor命令.editor命令提供了编辑多行命令的功能。这个内置编辑器不会保存代码当编辑器被关闭时所编辑的内容会被加载到全局范围内然后执行。使用如下命令开启内置编辑器.editor开启内置编辑器后如图所示。当输入内容完成后使用CtrlD键保存并执行内容使用CtrlC键取消操作。使用内置编辑器插入多行数据输入完成后按CtrlD键如图所示。从图中可以看到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--evalconfig.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--evaldisableTelemetry()当需要启动该配置时可以使用如下命令enableTelemetry()3、MongoDB Shell的运行命令MongoDB Shell会自动格式化数据的输入和输出mongosh命令使用Node.js BSON解析器来解析BJSON数据。3.1、切换数据库使用db命令查询当前所使用的数据默认使用test数据库。切换数据库时可以使用use命令如下所示usedatabase查询当前用户可用的数据库使用show dbs命令。show dbs3.2、创建数据库和集合当数据库不存在时使用use命令可以创建不存在的数据库。当集合不存在时使用插入命令可以直接创建集合并插入数据。use reading db.poetry.insertOne{title:将进酒};执行结果如图所示。3.3、终止命令当命令或查询正在运行时使用CtrlC键可以终止操作。当按键按下后mongosh会中断正在执行的命令尝试终止服务端的操作并返回关于该命令的提示信息。如果连续按下两次CtrlC键会退出当前的mongosh客户端。3.4、清空控制台当控制台输出内容较多需要清空时可以使用如下3种方式清空内容cls命令。CtrlL键。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*FROMbooks除查询全部文档外还可以使用命令field:value指定字段值来过滤文档。例如查询书名为《活着》的书命令如下db.books.find({title:活着})该条语句等同于如下SQL语句SELECT*FROMbooksWHEREtitle活着除此之外还可以使用查询操作符来查询数据语法如下{field1:{operator1:value1},...}查询1986年和1992年发表的作品命令如下db.books.find({year:{$in:[1986,1992]}})执行结果如图所示。该条语句等同于如下SQL语句SELECT*FROMbWHEREyearin(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变量命令如下keyVaultcsfleDatabaseConnection.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集合插入几条数据。脚本内容如下dbconnect(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目录下。查询脚本内容如下dbconnect(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后可以看到如下提示testlocalhost.localdomain