在macOS上搭建MongoDB作为开发环境所需要的数据库

2020-06-08

前言

在开发服务(Web Service)时一般需要先在自己的电脑上写代码并且测试代码,对涉及到MongoDB数据库访问的服务的开发,我们需要在开发机上安装并且运行MongoDB服务.

简单的步骤和说明

首先,MongoDB类似MySQL,Postgres,也叫DBMS(Database Management System),即,数据库管理系统,只不过,MySQL和Postgres主要处理的是用户对表的读写,而MongoDB主要处理的用户对「集」(Collection)的读写,这里的集类似于JavaScript中的Array,类似于一般编程语言中的「列表」或者「数组.在JavaScript中,数组可以用来存储0个或者多个对象(Object),在MongoDB中,Collection也是用来存储对象的,只不过,对象在MongoDB中不叫对象,叫「文档」(Document),因此MongoDB又称为是面向文档的数据库管理系.MySQL的大致抽象是:数据库管理系统包含多个数据库,每个数据库包含许多张表,每一张表有若干条记录(Record),而MongoDB的抽象大概是:数据库管理系统包含多个数据库,数据库包含许多个Collection,每个Collection又是由0个或者多个Document组成.我们会在实际当中更加直观地理解这一点.

首先,我们需要能够访问到一个运行着的MongoDB数据库管理系统实例,就从其官网的文档来看,大致有三种方式能够访问到这样的实例

  1. 在本机上安装mongod,这样可以通过127.0.0.1:27017访问到MongoDB数据库管理系统;
  2. 通过线上的MongoDB Atlas服务启动MongoDB Cluster实例,这其实就是运行在云上的MongoDB数据库管理系统,这有点类似于云计算厂商如亚马逊或者阿里云等提供的云服务器或者云数据库,我们会得到一个这样的实例的访问地址,有了这个访问地址我们可以通过MongoDB的客户端来访问之.
  3. 在云服务器上安装mongod并访问之,类似1.

下面,我们用简单的几行命令在自己电脑的macOS安装并启动mongod

brew tap mongodb/brew
brew install mongodb-community
brew services start mongodb-community

在macOS上,mongod的默认配置文件是位于/usr/local/etc/mongod.conf,默认端口是27017,默认监听地址是127.0.0.1:27017,这些是很容易确认.如果mongod服务成功地启动了,那么你可以通过

lsof -i 27017

命令来进行验证,会看到mongod进程正在监听着这个端.启动了mongod服务后,我们需要一个客户端,类似于要访问MySQL数据库管理系统,我们需要一个能执行SQL语句并且返回查询结果的客户端一样,要访问MongoDB数据库管理系统,我们也需要一个这样的客户端使我们可以执行MongoDB命令语句并且查看返回的查询结.满足这样条件的有

  1. mongodb shell,交互式的JavaScript执行面板,类似于Chrome浏览器开发者工具中手动执行JavaScript代码的Console页;
  2. MongoDB在各种编程语言下的API驱动,在官网被称作Drivers,一般以编程语言的软件包的形式提供,然后通过一些类或者函数来访问;
  3. MongoDB Compass,图形化的客户端,还能够看到各种数据库性能方面的统计信息.

最简单地,我们先来使用mongodb shell吧,初次安装并启动MongoDB后,直接在命令行运行

mongo

便可启动mongodb shell,有如下提示

启动了mongodb shell

启动了mongodb shell

然后可使用db命令来查看当前正在访问的数据库的名称,使用命令

db testDatabase

来切换到一个名叫testDatabase的数据库,在MongoDB中,可以随意切换数据库,如果那个数据库之前没被创建,那么当有数据写入时,会自动被创.再运行db命令查看当前的数据库名称,输出会是testDatabase,接下来我们就可以对这个testDatabase数据库进行增删查改操作了

插入命令有

db.collection.insertOne()
db.collection.insertMany()

查找命令有

db.collection.find()

修改命令有

db.collection.updateOne()
db.collection.updateMany()
db.collection.replaceOne()

删除命令有

db.collection.deleteOne()
db.collection.deleteMany()

可将其中的collection替换为你自己要去访问的Collection的名字(但是db却不能替换),例如

db.persons.insertOne({
    "name": "David",
    "age": 21
})

将在一个名为persons的Collection中增加一个文档,以上这条命令在SQL语言中就是

INSERT INTO persons (name, age) VALUES ('David', 21);

不过在mongodb shell是不能直接处理SQL语言的,所以,以后所有的CRUD操作都得由MongoDB的JavaScript风格的语言而不是SQL语言来表述.

要查找所有persons中所有年龄小于等于21岁的人

db.persons.find({
    "age": {$lte: 21}
})

其中的$lte称为「操作符」(operator),$lte在以上语句中的作用就是相当于SQL中的<=符.要查找所有persons中所有年龄等于21岁的人就是

db.persons.find({
    "age": 21
})

图语言(GraphQL)风格的查询语句最大的好处就是看起来更容易理解了,更加直观了,因为查询语句和用来表示数据的JSON语句结构相.还可以不带任何内容地执行查询,可以选出整张表(整个Collection)

db.persons.find({})

可以一次性插入多条记录(多个文档)

db.personalities.insertMany([
    {
        "date": "2020-04-20",
        "personalityType": "INTP-T",
        "personalityTypeAlias": "The Logician",
        "traits": {
            "introverted": 0.60,
            "intuitive": 0.55,
            "thinking": 0.54,
            "prospecting": 0.53,
            "turbulent": 0.58
        },
        "link": "https://www.16personalities.com/profiles/838016f7271a3"
    },
    {
        "date": "2020-06-07",
        "personalityType": "INTJ-T",
        "personalityTypeAlias": "The Architect",
        "traits": {
            "introverted": 0.68,
            "intuitive": 0.55,
            "thinking": 0.61,
            "judging": 0.54,
            "turbulent": 0.69
        },
        "link": "https://www.16personalities.com/profiles/493d632bc368f"
    },
    {
        "date": "2020-06-08",
        "personalityType": "INTP-T",
        "personalityTypeAlias": "The Logician",
        "traits": {
            "introverted": 0.65,
            "intuitive": 0.67,
            "thinking": 0.63,
            "prospecting": 0.53,
            "turbulent": 0.69
        },
        "link": "https://www.16personalities.com/profiles/01bbdd967c6f8"
    }
])

会看到提示

{
	"acknowledged" : true,
	"insertedIds" : [
		ObjectId("5ede61e2f13f5dcff6630029"),
		ObjectId("5ede61e2f13f5dcff663002a"),
		ObjectId("5ede61e2f13f5dcff663002b")
	]
}

可全部选出来

db.personalities.find({})

输出就是

{ "_id" : ObjectId("5ede61e2f13f5dcff6630029"), "date" : "2020-04-20", "personalityType" : "INTP-T", "personalityTypeAlias" : "The Logician", "traits" : { "introverted" : 0.6, "intuitive" : 0.55, "thinking" : 0.54, "prospecting" : 0.53, "turbulent" : 0.58 }, "link" : "https://www.16personalities.com/profiles/838016f7271a3" }
{ "_id" : ObjectId("5ede61e2f13f5dcff663002a"), "date" : "2020-06-07", "personalityType" : "INTJ-T", "personalityTypeAlias" : "The Architect", "traits" : { "introverted" : 0.68, "intuitive" : 0.55, "thinking" : 0.61, "judging" : 0.54, "turbulent" : 0.69 }, "link" : "https://www.16personalities.com/profiles/493d632bc368f" }
{ "_id" : ObjectId("5ede61e2f13f5dcff663002b"), "date" : "2020-06-08", "personalityType" : "INTP-T", "personalityTypeAlias" : "The Logician", "traits" : { "introverted" : 0.65, "intuitive" : 0.67, "thinking" : 0.63, "prospecting" : 0.53, "turbulent" : 0.69 }, "link" : "https://www.16personalities.com/profiles/01bbdd967c6f8" }

我们看到,不像MySQL中的表要满足关系对象模型中的第一范式(原子性)的约束,在MongoDB中,文档中还可以嵌入文档,而且嵌入多少层都没问题,比如说,personalities这个Collection中每条文档所包含的traits属性其实就还是一个文档,这在MongoDB中是没问题的.

甚至,Collection中的文档都不一定得要求是同样结构的,比如说

> db.fooCollection.insertMany([
... {
... "a":["b","c",1,2,345,6,7],
... "b":{"c":{"d":12345}}
... },
... {
... "xyz":321
... }
... ])
{
	"acknowledged" : true,
	"insertedIds" : [
		ObjectId("5ede6385f13f5dcff663002c"),
		ObjectId("5ede6385f13f5dcff663002d")
	]
}

还有

> db.fooCollection.find({})
{ "_id" : ObjectId("5ede6385f13f5dcff663002c"), "a" : [ "b", "c", 1, 2, 345, 6, 7 ], "b" : { "c" : { "d" : 12345 } } }
{ "_id" : ObjectId("5ede6385f13f5dcff663002d"), "xyz" : 321 }

面向文档的数据库管理系统使用起来是没有太多约束的呵.说白了,MongoDB中的文档就是JavaScript中的对象,Python中的词典,自然地,表现力就强很多,而MySQL中的记录则是数学上的「关系」(Relation),一个关系是若干个集合的笛卡尔积的元素,一个关系能表达出什么东西来,还要看形成这个关系所属的笛卡尔积的哪些个集合都包含哪些元素.

一般来说CRUD都是随用随查,官网讲得详细得.下面开始讲MongoDB的API.

在Node.js中访问MongoDB数据库

数据库更加常用的功能其实是为软件、系统或者服务管理数据,而非作为用户日常使用的笔记本或者表格软.首先在Node.js项目的根目录中运行命令

npm install mongodb --save

以安装在Node.js中操作MongoDB所需的Driver.

开发环境mongodbmacos

解决GitHub网络拥堵问题的一点小技巧

从感知机到神经网络