[Day 02] - Mongo DB环境建置

第二天,首先我打算先把Mongo DB环境建起来

为了方便,就用docker在local部属 Mongo DB的image来省去实机安装的工

首先是安装Docker,
(到docker的官方网站下载Docker ,因为我以前就装好了,所以安装过程略过)

Docker对现在的程序开发者、电脑洁癖几乎已经是离不开的工具了,
他最大的优点是部属非常方便、确保环境的一致
只要有一台有安装docker的PC或Server,
那麽不论这台电脑是Linux或是Windows,只要系统资源足够,
那就只需要把Docker image run起来就能把想要的服务建起来了,
微服务架构的系统也几乎都是以这类docker容器化技术来实现,

虽然我自己对Docker其实也只是会用而已,谈不上精通
但对於软件工程师来说,不论专精前端还是後端,
我觉得Docker已经是除了git之外的第二个必备技能了

在学Docker首先会遇到的两个名词:Image 跟 Container

Image(映像档),可以把它想像成一份设计图
Container(容器),就像是设计图建立起来的建筑物,

docker运行环境建置完成後,就是用这两样东西来建立Mongo DB

首先 在cmd下指令,将最新版Mongo DB 的image取下来:

docker pull mongo:latest

接着执行

docker run --name mongo -v /d/tmp/mongo/data:/data/db -d -p 27017:27017 mongo:latest

将Mongo 运行起来
docker run 指令 以指定的image为基准,建立一个container

--name 指定建起来的container名字
-v 连结local端目录与container目录 (像Linux中mount共用空间的概念)
-d 背景执行
-p 指定将docker内的某port与本地端的某port连结在一起 ,透过这样的设定就可以透过本地直接连container了

进入container中 可以看看这是什麽版本的Mongo

mongo -version
MongoDB shell version v5.0.2

当下的latest版本是5.0.2

这边为了方便测试,我安装了Studio 3T这个Mongo DB专用的图形化介面工具,方便我们测试与查看资料库内容
它本身是付费工具,不过有30天的免费试用,30天不用白不用,到期後可以改为使用免费的Robo 3T

安装完成後先建立连线
https://ithelp.ithome.com.tw/upload/images/20210917/201289732U5EPh0kfY.png

建立连线後 选择IntelliShell
https://ithelp.ithome.com.tw/upload/images/20210917/20128973sa4kNsVWCp.png

use [DB Name]

↑是切换DB的指令,如果没有这个DB,就会直接新增它

use testDB;

↑建立testDB这个资料库

show dbs;

↑可以看到目前存有哪些资料库
https://ithelp.ithome.com.tw/upload/images/20210917/20128973OyjkmTdQFJ.png

输入指令建立新的User 作为後端连接资料库时使用

use admin

db.createUser({
    user:"iron30",
    pwd:"123456",
    roles:[
        {role:"readWrite",db:"testDB"},
    ]
})

https://ithelp.ithome.com.tw/upload/images/20210917/20128973UdhMnA0Uqu.png

也建一个root

db.createUser(
    {
        user:"root",
        pwd:"root",
        roles:["root"]
    }
)

因为暂时还没找到让登入验证立即生效的做法,
所以我目前是这样做:
在cmd下docker指令

#停止mogo这个container
docker stop mongo
#移除mongo这个container
docker rm mongo

加上--auth以需要验证的方式重建mongo的container

docker run --name mongo -v /d/tmp/mongo/data -d -p 27017:27017 mongo:latest mongod --auth

因为我们把data都bind在/d/tmp/mongo/data:/data/db ,所以先前的设定都还保留着

看看一下是否成功

https://ithelp.ithome.com.tw/upload/images/20210917/20128973MX8RZQ8QnP.png

测试连线ok

https://ithelp.ithome.com.tw/upload/images/20210917/20128973J5FEuMwqTs.png

在testDB试着insert一笔资料试试看

use testDB;

try {
   db.products.insertOne( { item: "card2", qty: 150 } );
} catch (e) {
   print (e);
};

再查询看看有没有insert进去

db.getCollection("products").find({});

https://ithelp.ithome.com.tw/upload/images/20210917/20128973zF17MKn3GO.png
看来是有的

NOSQL除了在处理大量资料效能优异之外,使用上也非常有弹性,
在Mongo DB 没有table,取而代之的是collection,collection中所存的资料是一笔笔的document,
在insert document时,不像在传统的RDMS上会受限於TABLE的栏位设计,
然而,这不代表我们就不用规划资料的储存格式与架构,
毕竟在没有规范的情况下,随着时间拉长,维运的成本会变得很可怕

在MongoDB的文件里还有很多方法使用,大家可以去试试看

MongoDB的准备就到这里差不多告一个段落

明天就来准备後端吧


<<:  #17 JS: loop - Part 2

>>:  从零开始的8-bit迷宫探险【Level 9】与 SpriteKit 的初次见面 (二)

LIFF APP 串接发送认证码 API

今天要结合前两天的成果,完成 LIFF APP 串接 发送认证码 API 的功能 目标 要完成的功能...

Day 15 | 魔术方块AR游戏开发Part4 - 面的旋转(下)+游戏机制

在上一篇我们完成面的旋转,却发现旋转途中若点击放开,面会停留在旋转途中,今天我们就要来解决这个问题。...

Day 27 |> Elixir 并行性 (一)

这篇不承接上一篇,因为时间太赶了,所以来看 Elixir 并行程序的部分。 Elixir 的 Pro...

D27-(9/27)-长兴(1717)-化学传产的好公司

注:发文日和截图的日期不一定是同一天,所以价格计算上和当日不同,是很正常的。 声明:这一系列文章并无...

D27 - 彭彭的课程# Python 实体物件的建立与使用 - 下篇 - 实体方法 - Instance Method(1)

今天雨弹狂炸 交通真的是有够不便QQ 希望可以快点发明像多拉A梦的道具弄个什麽就不会淋到雨的产品 好...