让我们尝试将 Visual Studio Code 连接到 MongoDB!
首先
该文章是Visual Studio Code Advent Calendar 2020的第11天文章。
这次我们将使用MongoDB for VS Code来连接MongoDB,正如标题所述。(注:Visual Studio Code将缩写为VSCode)
顺便问一下,为什么选择MongoDB?
目前作为个人学习,我正在努力完成由MongoDB官方提供的在线学习课程——MongoDB University。
作为MongoDB的客户端,有一个非常出色的工具叫做MongoDB Compass。然而,如果在编码过程中,我希望能够在编辑器内轻松查看数据…
另外,随着课程的进展,除了使用API进行操作以外,还涉及到MongoDB的进程和运营方面的主题,所以能看到更多的数据文件等会更好。
幸运的是,由于Docker提供了官方镜像,所以可以在本地开发环境中使用Docker来启动。基于这一点,我思考着”是否可以在VSCode内完成全部操作呢?”,并试着实施了下来。
首先让我们使用MongoDB的Docker镜像吧!
实际上,你无需在本地启动Docker的MongoDB,只要使用MongoDB Atlas这个云服务,即使在免费配额中,也可以操作MongoDB,因此你可以试用MongoDB扩展。
然而,鉴于上述情况,我们决定通过使用Docker启动来确认一下进程和数据文件的管理方式。
从公式形象启动它吧!
我們將使用這個影像。
- https://hub.docker.com/_/mongo
考虑到我的Mac环境,我使用Docker for Mac作为Docker的主机,而VSCode的Docker插件非常方便,每天都在不断进化,没有它我就无法完成工作。
# まずはイメージを引っ張ってきます
docker pull mongo
获取镜像后,使用VSCode的Docker扩展可以显示Docker镜像列表和正在运行的容器。
可以直接从VSCode右键菜单启动MongoDB镜像。
当容器启动后,MongoDB容器将显示在顶部。
您可以通过右键单击进一步访问正在运行的容器内部,以及查看日志。
容器内的文件系统也可以在VSCode中显示。
让我们进入容器并尝试使用Mongo Shell!
从VSCode的容器视图中,通过右键单击附加到容器。(通过Attach Shell,实际上会执行docker exec命令)
我尝试使用容器内的ps命令来确认MongoDB进程是否正在运行,因为MongoDB官方镜像可以访问Shell。
内部当然包含MongoDB Shell(用于访问数据库的命令行客户端),只需输入简单的mongo命令即可进行操作。
虽然有点长,但我会把在容器内的结果贴出来。
# mongoコマンドで起動(内部からでパスワード無し)
root@b0c9ee280d35:/# mongo
MongoDB shell version v4.4.2
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("fec4ef7e-b4b4-4b55-937c-1ccf82510de9") }
MongoDB server version: 4.4.2
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
https://docs.mongodb.com/
...[一部略]...
---
> show databases
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB
> use test
switched to db test
> show collections
sales
> db.sales.findOne()
{
"_id" : 1,
"item" : "abc",
"price" : 10,
"quantity" : 2,
"date" : ISODate("2014-03-01T08:00:00Z")
}
可以显示数据库列表,并且可以切换到测试数据库。
此外,我们还将查看位于/data/db目录下的数据文件。
root@b0c9ee280d35:/data/db# pwd
/data/db
root@b0c9ee280d35:/data/db# ls -w 1
WiredTiger
WiredTiger.lock
WiredTiger.turtle
WiredTiger.wt
WiredTigerHS.wt
_mdb_catalog.wt
collection-0--359143437334718796.wt
collection-13--359143437334718796.wt
collection-2--359143437334718796.wt
collection-4--359143437334718796.wt
diagnostic.data
index-1--359143437334718796.wt
index-14--359143437334718796.wt
index-3--359143437334718796.wt
index-5--359143437334718796.wt
index-6--359143437334718796.wt
journal
mongod.lock
sizeStorer.wt
storage.bson
由于MongoDB的存储引擎采用了WiredTiger,所以我们可以确认存在WiredTiger.*的文件。
集合(相当于数据库)的文件和索引文件的扩展名为.wt。
Docker扩展真方便啊!
让我们尝试使用VS Code的MongoDB插件吧!
时间有点长了,但现在开始进入正题。
首先在扩展功能菜单中搜索MongoDB,并尝试添加。
截至20201211,它仍然是预览版,但已经可以做很多事情了!
20201211时点的功能如下:
-
- MongoDB Atlas、もしくは任意のMondoDBに接続ができる
コレクション(テーブルに相当)の表示
スキーマの表示
ドキュメント(レコードに相当)の表示
MongoDB Playgrounds という機能で、エディタ上に記載したMongoDB用のクエリを実行し、データの追加や検索、アグリゲーションの操作ができる
MongoDB Shellの起動ができる4
Terraformを使って、MondoDB Atlas上のデータベースの構成を管理できる
GitHub上有很多问题(特性),未来将会更加令人期待!
首先让我们尝试建立连接吧!
在Mac上,即使没有特殊配置,在Docker上启动的MongoDB也能通过以下命令启动,并将端口27017转发到本地,这样就可以通过localhost:27017进行连接了。
docker run --rm -d -p 27017:27017/tcp mongo:latest
当您添加了扩展功能,叶子图标就会显示在左边的栏中,您可以通过它切换到MongoDB操作面板。
在Connections的菜单中右键单击选择“添加MongoDB连接”,以执行连接设置。这将显示连接设置的界面。
只要简单地启动,密码将在没有设定的情况下启动,所以连接设置只需按以下步骤并按下按钮即可。5
-
- Hostname: localhost
- Port: 27017
如果您的电脑或使用环境中的防火墙或安全软件阻止了 27017 端口的通信,连接可能会失败,请注意!
如果成功的话,会在左侧显示数据库列表。
目前只有管理用的内容。
点击每个数据库,将显示对应的集合。
继续点击,还可以显示索引、模式和数据。
让我们试着使用MongoDB Playgrounds创建一个数据库吧!
如果您以前使用过某种数据库的GUI客户端,那么我相信您会直观地理解后续的操作。
既然仅使用管理数据库会有问题,所以我想尝试创建数据库。
虽然可以使用MongoDB Shell来创建数据库,但是这个扩展功能还包含了MongoDB Playgrounds功能。
在操作面板的底部,有一个名为”创建新的游乐场”的按钮,当点击它时,会显示一个屏幕,上面写着用于操作MongoDB的示例脚本。
这种语言被称为MQL(MongoDB查询语言)。
这个屏幕显示着这样的内容。
内容大致如下。
-
- 任意のデータベース(ここではmongodbVSCodePlaygroundDB)に接続
-
- データベースのsalesというコレクションにデータを追加
ちなみに、デフォルトではコレクションが存在しない場合は、勝手に作成されます
データ登録後、find() クエリで検索を実行します
aggregationを使って、検索&集計をします
// Select the database to use.
use('mongodbVSCodePlaygroundDB');
// Insert a few documents into the sales collection.
db.sales.insertMany([
{ '_id' : 1, 'item' : 'abc', 'price' : 10, 'quantity' : 2, 'date' : new Date('2014-03-01T08:00:00Z') },
{ '_id' : 2, 'item' : 'jkl', 'price' : 20, 'quantity' : 1, 'date' : new Date('2014-03-01T09:00:00Z') },
{ '_id' : 3, 'item' : 'xyz', 'price' : 5, 'quantity' : 10, 'date' : new Date('2014-03-15T09:00:00Z') },
{ '_id' : 4, 'item' : 'xyz', 'price' : 5, 'quantity' : 20, 'date' : new Date('2014-04-04T11:21:39.736Z') },
{ '_id' : 5, 'item' : 'abc', 'price' : 10, 'quantity' : 10, 'date' : new Date('2014-04-04T21:23:13.331Z') },
{ '_id' : 6, 'item' : 'def', 'price' : 7.5, 'quantity': 5, 'date' : new Date('2015-06-04T05:08:13Z') },
{ '_id' : 7, 'item' : 'def', 'price' : 7.5, 'quantity': 10, 'date' : new Date('2015-09-10T08:43:00Z') },
{ '_id' : 8, 'item' : 'abc', 'price' : 10, 'quantity' : 5, 'date' : new Date('2016-02-06T20:20:13Z') },
]);
// Run a find command to view items sold on April 4th, 2014.
db.sales.find({ date: { $gte: new Date('2014-04-04'), $lt: new Date('2014-04-05') } });
// Run an aggregation to view total sales for each product in 2014.
const aggregation = [
{ $match: { date: { $gte: new Date('2014-01-01'), $lt: new Date('2015-01-01') } } },
{ $group: { _id : '$item', totalSaleAmount: { $sum: { $multiply: [ '$price', '$quantity' ] } } } }
];
db.sales.aggregate(aggregation);
你可以直接将这段内容粘贴到MongoDB Shell中,但是使用MongoDB Playgrounds,你会在屏幕顶部看到一个执行标志”▶︎”,点击该标志后,就会执行上述操作。
另外,如果选择要执行的部分(行),会模糊显示出▶︎的执行标记,并且只会执行该部分。
在Playground的面板上执行操作后,从MongoDB的操作面板上可以确认到,已经创建了名为”sales”的数据库,并且添加了8条数据。
另外,您可以选择按部分执行,并且执行结果将在另一个面板中显示。
由于这个Playground上的面板内容可以进行修改并执行,所以在不使用MongoDB Shell的情况下,特别适合想要提交复杂查询的场合。
总结
我已经大致介绍了以上的功能。
在MongoDB for VS Code的操作面板下方,提供了指向文档、指向GitHub问题以及在MongoDB Atlas上创建群集的快捷方式的链接。
还在不断开发中,希望能够更多地使用并提供一些反馈意见。
这次我们同时提到了Docker扩展插件。
Docker技术正在不断发展,大规模管理的技巧我还追不上,但是基本的镜像和容器操作,可以借助图形界面来确认并逐步学习。
如果你正在进行应用开发,一定要尝试结合使用VSCode!
这是一个在线学习课程,可以学习MongoDB的基础知识。课程分为基础课程、开发者课程和管理员课程,涵盖了数据建模、安全性、调试等方面的内容。
我在名为“MongoDB大学”的学习记录中详细记录了学习过程。
现在,您可以进入Docker容器,并直接在VSCode中编辑容器内的文件。(https://code.visualstudio.com/docs/remote/containers)
它会调用本地的MondoDB Shell (mongosh)。因此,需要安装mongosh并将其添加到VSCode的路径中。
在实际操作中,这种状态是不理想的,因此我们应该在启动时启用身份验证…
请参考https://developer.mongodb.com/how-to/getting-started-atlas-mongodb-query-language-mql获取如何在此Playground中使用MQL的详细介绍。