MongoDB

数据库(DataBase)

数据库是按照数据结构来组织、存储和管理数据的仓库。

我们的程序都是在内存中运行的,一旦程序运行解决或计算机断电,程序运行中的数据都会丢失。

所以我们就需要一些程序运行的数据持久化到硬盘之中,以确保数据的安全性。而数据库就是数据持久化的最佳选择。说白了,数据库就是存储数据的仓库。

数据库的分类

-关系型数据库(RDBMS)

--MySQL、Oracle、SQLServer等 --关系型数据库中全是表结结构存储数据的

-非关系型数据库(No SQL)

--Mongdb、Redis等 --键值对数据库 --文档型数据库(Mongodb)

数据库的组成部分

数据库的服务器----->服务器用来保存数据

数据库的客户端------>客户端用来操作服务器,对数据进行增删改查操作

MongoDB简介

--MongoDB是为快速开发互联网Web应用而设计的数据库系统。
--MongoDB的设计目标是极简、灵活、作为Web应用栈的一部分。
--MongoDB的数据模型是面向文档的,所谓文档是一种类似于JSON的结构,简单理解MongoDB这个数据库中存的是各种各样的JSON。(BSON)
注意:BSON表示:二进制json

MongoDB的下载安装

下载

--下载地址: https://www.mongodb.org/dl/win32/ 
--MongoDB的版本偶数版本(说的小版本)为稳定版,奇数版本为开发版。
--MongoDB对于32位系统支持不佳,所以3.2版本以后没有再对32位系统的支持。

根据你的系统下载 32 位或 64 位的 .msi 文件,下载后双击该文件,按操作提示安装即可。

安装

安装过程中,你可以通过点击 “Custom(自定义)” 按钮来设置你的安装目录。

mongodb 可以用来做数仓吗 mongodb 数据仓库_mongodb

mongodb 可以用来做数仓吗 mongodb 数据仓库_mongodb_02

下一步安装 “install mongoDB compass” 不勾选(当然你也可以选择安装它,可能需要更久的安装时间),MongoDB Compass 是一个图形界面管理工具,我们可以在后面自己到官网下载安装,下载地址:https://www.mongodb.com/download-center/compass

mongodb 可以用来做数仓吗 mongodb 数据仓库_字段_03

MongoDB的配置添加

MongoDB不会想Oracle、MySQL一样安装好,配置就自动添加了,而是需要手动配置添加。

将MongoDB的bin目录添加到电脑的环境变量中的path变量中

MongoDB的启动

1.在磁盘根目录下创建data文件夹,在data下创建db文件夹(自己选择)
2.打开CMD命令行窗口,输入mongod启动服务器(32位系统第一次启动:– mongod --storageEngine=mmapv1,再次启动直接mongod)
3.当出现如下图时,表示启动成功

mongodb 可以用来做数仓吗 mongodb 数据仓库_mongodb_04

4.重新打开一个cmd窗口,输入mongo 连接mongodb客户端去操作服务器进行数据的增删改查操作(之前开启Mongodb服务的cmd窗口保留)【出现大于符号(>)表明连接mongodb成功】

制定数据库路径和端口号

在控制台启动MongoDB,使用命令:
mongod --dbpath 数据库路径 --port 端口号(最好4位以上,默认27017,最大不要超过65535)
注意:
	端口可以不加,表示修改数据库存放路径

查看是否启动成功

在浏览器上输入localhost:端口号
如果出现下图的信息说明Mongodb启动成功!!

mongodb 可以用来做数仓吗 mongodb 数据仓库_数据库_05

MongoDB设置为开机启动

从MongoDB 4.0开始,您可以在安装过程中将MongoDB设置为Windows服务,也可以仅安装二进制文件

mongodb 可以用来做数仓吗 mongodb 数据仓库_字段_06

选择“ 将MongoD作为服务安装”。
选择以下任一项:
	以网络服务用户身份运行服务(默认这是Windows内置的Windows用户帐户
	以本地或域用户身份运行服务
        对于现有的本地用户帐户,请.为“ 帐户域”指定一个句点(即),并为该用户指定“ 帐户名”和“ 帐户密码 ”。
        对于现有的域用户,请为该用户指定“ 帐户域”,“ 帐户名称”和“ 帐户密码 ”。
        
服务名称。指定服务名称。默认名称为MongoDB。如果您已经具有使用指定名称的服务,则必须选择另一个名称。

数据目录。指定数据目录,它对应于 --dbpath。如果目录不存在,则安装程序将创建目录并将目录访问权限设置为服务用户。

日志目录。指定日志目录,它对应于 --logpath。如果目录不存在,则安装程序将创建目录并将目录访问权限设置为服务用户。
在选择自定义的安装目录后,安装过程中报:错误1053,然后再mongodb的bin路径下的mongod.cfg文件的最后没有mp:,则看下进入服务 看下服务的登录是否以本地账户登录,不是则修改过来,即可启动服务器
4.0之前需要手动设置
1.在之前的data文件夹中再创建一个log文件夹(已经有db文件夹)
2.创建配置文件
	在Mongodb的安装目录的server目录,直到看到bin目录的当前目录下创建一个mongod.cfg文件,添加如下内容:
systemLog:
	destination: file
	path: c:\data\log\mongod.log
storage:
	dbPath: c:\data\db
注意:systemLog下的path表示日志路径;storage下的dbPath表示数据库路径
3.以管理员的身份打开cmd窗口
4.执行如下命令:
sc.exe create MongoDB binPath= "\"mongo bin路径\mongod.exe\" --service --config=\"mongo路径\mongod.cfg\"" DisplayName="MongoDB" start= "auto"
5.打开 服务 ,找到MongoDB的服务启动
6.如果启动失败,证明上边的操作有误。再控制台输入sc delete MongoDB 删除之前配置的服务,然后从第一步再来一次

三个概念

数据库(database)
	-数据库是一个仓库,在仓库中可以存放集合。
集合(collection)
	-集合类似一个数组,在集合中可以存放文档。集合中存储的文档可以是各式各样的,没有格式要求。
文档(document)
	-文档数据库中的最小单位,我们村存储和操作的内容都是文档。类似于JS得到对象,在MongoDB中每一条数据都是一个文档。
	
多个文档组成集合,多个集合组成数据库

mongodb 可以用来做数仓吗 mongodb 数据仓库_mongodb_07

基本操作

1.show  dbs/databases  查看所有数据库
2.use 数据库名  进入制指定数据库
	注意:在MongoDB中,数据库和集合都不需要手动创建,当我们创建文档时,如果文档所在的集合或数据库不存在,则自动创建集合和数据库。
3.db	表示当前所在的数据库
4.show collections 	显示当前数据库中所有的集合

数据库的CRUD操作

添加文档

在添加文档时,如果没有给文档指定_id属性,则数据库会自动为文档添加_id属性,该属性用来作为文档的唯一标识。

ObjectId()方法可以自动生成不重复id
_id也可以自己定义
例句:
db.haha.insert({"_id":"12345",name":"张三","age":18,:"sex","男"});
向集合中插入一个或多个文档
指令: db.<collection>.insert(文档)	
注意:<collection> 表示集合名
例句:
	添加一个文档
db.haha.insert({"name":"张三","age":18,:"sex","男"});
	添加多个文档
db.haha.insert([
	{"name":"张三","age":18,:"sex","男"},
	{"name":"张三","age":18,:"sex","男"}
]);
向集合中插入一个文档(3.2版本及以后)
指令:db.<collection>.insertOne(文档)
向集合中插入多个文档(3.2版本及以后)
指令:db.<collection>.insertMany(文档)

删除文档

remove()方法
指令:db.<collection>.remove(条件)		删除符合条件的文档
注意:如果条件中增加一个参数true,则表示只会删除符合条件的一个文档
remove({}):表示删除集合中的所有文档(性能略差)[一个一个得到删除文档,所以性能略差]
deleteOne()方法
指令:db.<collection>.deleteOne(条件)	删除符合条件的一个文档
deleteMany()方法
指令:db.<collection>.deleteMany(条件)	删除符合条件的多个文档
删除集合
指令:db.<collection>.drop()		删除当前集合
注意:当删除的集合在所在数据库中的额最后一个时,删除集合时会连着删除数据库
删除数据库
指令:db.dropDatabase()		删除数据库(必须进入数据库)
注意
一般数据库中的数据都不会删除,所以删除的方法很少调用;一般会在数据中添加一个字段,来表示数据是否被删除
字段:isDel,值:1(true),0(false)
所以当查询所有时,查询的是find({"isDel":0})的值

修改文档

默认修改一个文档
指令:db.<collection>.update(查询条件,新对象)
注意:
	1.默认情况下会使用新对象替换旧对象
	2.如果需要修改指定的属性,而不是替换需要使用“修改操作符”来完成修改
	3.默认只修改一个文档
例句:修改姓名叫张三的年龄为18岁
db.<collection>.update(
	{"name" : "zhangsan"},
	{$set : {
		"age" : 18
		}
	},
	{
		"multi" : true//开启多个匹配修改
	}
);
修改多个文档(3.2版本及以上)
指令:db.<collection>.updateMany(查询条件,新对象)
修改一个文档(3.2版本及以上)
指令:db.<collection>.updateOne(查询条件,新对象)
替换一个文档(3.2版本及以上)
指令:db.<collection>.updateOne(查询条件,新对象)
常见修改操作符

修改操作符

含义

$set

可以用来修改文档中指定的属性,如果字段不存在,则创建

$unset

可以用来删除文档的指定属性

$inc

用来x修改已有键的值,或则键不存在,则创建。 注意:只能用于Number类型的值

查询文档

查询符合条件的所有文档
指令: db.<collection>.find()		返回值类型:数组对象(下标从0开始)
find()/find({}):表示查询当前集合中所有文档
find({字段名:值,字段名:值}):表示查询属性是指定值的文档
查询符合条件的第一个文档
指令:db.<collection>.findOne()	返回值类型:文档对象
findOne({字段名:值,字段名:值})
查询集合中的个数
指令: db.<collection>.find().count()
查询条件操作符

查询条件操作符

含义

$gt

大于

$lt

小于

$gte

大于等于

$glt

小于等于

$ne

不等于

$in

查询一个键的多个值(包含)

$nin

不包含

$or

满足其中一个即可(或者)

文档之间的关系

一对一(one to one)

在MongoDB中可以通过内嵌文档的形式来体现出一对一的关系。

理解:一个文档中内嵌一个文档,内嵌的文档是外层文档的一个属性。

例句:
db.<collection>.insert([
	{
		"name" : "妻子",
		"zhangfu":{
			“name" : "丈夫"
		}
	}
]);

一对多(one to many)/多对一(many to one)

1.也可以通过内嵌文档的方式来映射一对多的关系

理解:一个文档中嵌套一个数组,数组含有多个文档;内嵌的文档数组是外层文档的一个属性。

例句:
db.<collection>.insert([
	{
		"name" : "用户",
		"zhangfu":[
			{
				"name" : "订单"
			},
			{
				"name" : "订单"
			}
		]
	}
]);
2.可以通过相关联的集合中文档的_id来映射

理解:类似关系型数据库Mysql的外键来映射两个表的关系

例句:
db.users.insert([
	{
		”_id“ : "id信息",//不写默认生成
		"name" : "用户",
	}
]);
db.orders.insert([
	{
		”_id“ : "id信息",//不写默认生成
		"name" : "用户",
		"user_id" : "user集合中的相应文档的_id值"
	}
]);

多对多(many to many)

把一对多的映射字段变为一个数组即可,
例句:
db.teachers.insert([
	{
		”_id“ : "123456",//不写默认生成
		"name" : "teacher",
	},
	{
		”_id“ : "789",//不写默认生成
		"name" : "teacher2"
	}
]);
db.students.insert([
	{
		”_id“ : "id信息",//不写默认生成
		"name" : "student1",
		"user_id" : [
			"123456",
			"789"
		]
	},
	{
		”_id“ : "id信息",//不写默认生成
		"name" : "student2",
		"user_id" : [
			"123456"
		]
	}
]);
理解:id为789的老师有两个学生,而name为student1的学生有两个老师,则就形成了多对多的关系。

sort和投影

查询文档时,默认情况下是按照_id的值进行排序(升序)。

sort()

sort()可以用来指定文档的排序的规则,使用sort()时需要一个对象来指定排序规则。其中,指定对象需要给定一个值来表示升序(1)还是降序(-1)。

例句:
db.<collection>.find().sort({"age":1});
理解:按照age升序排列。

db.<collection>.find().sort({"age":1,"sal" : -1});
理解:先按照年龄升序排列,当年龄相同时按照工资降序配列。

投影

在查询时,可以在第二个参数的位置来设置查询结果的投影。来自定义的控制展示结果中的字段。

例句:
db.<collection>.find({},{"age" : 1,"_id" : 0})
理解:查询当前集合中所有文档,只展示age字段,不展示_id字段。(注意:_id字段默认展示,除非对他设置,不然会展示)