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(自定义)” 按钮来设置你的安装目录。
下一步安装 “install mongoDB compass” 不勾选(当然你也可以选择安装它,可能需要更久的安装时间),MongoDB Compass 是一个图形界面管理工具,我们可以在后面自己到官网下载安装,下载地址:https://www.mongodb.com/download-center/compass。
MongoDB的配置添加
MongoDB不会想Oracle、MySQL一样安装好,配置就自动添加了,而是需要手动配置添加。
将MongoDB的bin目录添加到电脑的环境变量中的path变量中
MongoDB的启动
1.在磁盘根目录下创建data文件夹,在data下创建db文件夹(自己选择)
2.打开CMD命令行窗口,输入mongod启动服务器(32位系统第一次启动:– mongod --storageEngine=mmapv1,再次启动直接mongod)
3.当出现如下图时,表示启动成功
4.重新打开一个cmd窗口,输入mongo 连接mongodb客户端去操作服务器进行数据的增删改查操作(之前开启Mongodb服务的cmd窗口保留)【出现大于符号(>)表明连接mongodb成功】
制定数据库路径和端口号
在控制台启动MongoDB,使用命令:
mongod --dbpath 数据库路径 --port 端口号(最好4位以上,默认27017,最大不要超过65535)
注意:
端口可以不加,表示修改数据库存放路径
查看是否启动成功
在浏览器上输入localhost:端口号
如果出现下图的信息说明Mongodb启动成功!!
MongoDB设置为开机启动
从MongoDB 4.0开始,您可以在安装过程中将MongoDB设置为Windows服务,也可以仅安装二进制文件
选择“ 将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中每一条数据都是一个文档。
多个文档组成集合,多个集合组成数据库
基本操作
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字段默认展示,除非对他设置,不然会展示)