MongoDB
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库(NoSql,Not Only SQL)之间的产品,是非关系数据库当***能最丰富,
最像关系数据库的。它支持的数据结构非常松散,是类似json的bson(byte json)格式,因此可以存储比较复杂的数据类型。
Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库
单表查询的绝大部分功能,而且还支持对数据建立索引。
特点:
- 节省内存,实现冷热数据(热数据放内存,冷数据放硬盘)
- 高并发情况下快速写入海量数据的一种产品
- 可以写筛选条件
属性:
- database 数据库:是一个仓库,在仓库中可以存放集合。
- collection 集合:类似于数组,在集合中可以存放文档。
- document 文档:数据库中的最小单位,存储和操作的内容都是文档。
在MongoDB中,数据库和集合都不需要我们手动创建。
当我们创建文档时,如果文档所在的集合或数据库不存在的时会自动创建数据库和集合。
MongoDB和关系型数据库的比较:
- 不需要提前设计好数据结构
- 往里面写数据,只要是json格式就行了
安装:
- 下载 https://www.mongodb.com/try/download/community
- 配置环境变量
- 在C盘根目录下创建 data 文件夹,并在data文件夹中创建 db 文件夹(数据库路径)
- 在cmd 命令行中 输入 mongod 运行服务端
(32位机器第一次启动时需要输入 mongod --storageEngine=mmapv1,后续启动不需要) - 再打开一个命令行窗口,输入 mongo 运行打开客户端
指定数据路径命令: mongod --dbpath 物理路径
指定端口启动: mongod --dbpath 物理路径 --port 端口号
默认端口:27017
将MongoDB设置为系统服务,可以自动在后台启动,不用每次都手动启动。
图形化工具:
1. MongoChef | NoSQL for MongoDB Freeware
F6 执行当前光标所在行的语句
2. Studio 3T
基本操作:
基本指令:
show databases
show dbs显示当前所有的数据库
use 数据库名
进入到指定的数据库中
db
db表示的是当前所处的数据库
show collections
显示数据库中所有的集合
CRUD操作:
(1)新增:db.<collection>.insert(doc) - 向数据库中插入文档 - 当我们向集合中插入文档时,如果没有给文档指定 _id 属性时,则数据库会自动为文档添加 _id, 该属性用来作为文档的唯一标识, ObjectId(),时间戳与机器码。 _id 可以自己指定,如果指定了数据库就不会自动添加,但是需要保证唯一。 - 例子:向test数据库中的,stus集合 中插入一个新的学生对象 {name:"孙悟空",age:18,gender:"男"} db.stus.insert({name:"孙悟空",age:18,gender:"男"}) db.<collection>.insertOne(doc) - 插入一个文档,3.2版本以后支持 db.<collection>.insertMany(doc) - 插入多个文档,3.2版本以后支持
(2)查询:
db.<collection>.find() db.<collection>.find({}) - 查询当前集合中的所有文档 (注意:开发时绝对不会去查询所有的数据,性能较差) - 例子:查找stus集合的所有文档 db.stus.find() db.<collection>.find({属性:值}) - 查询属性是指定值的文档。 find()返回的是一个数组 findOne()返回的是一个集合对象 db.<collection>.findOne() - 查询集合中符合条件的第一个文档 db.<collection>.find().count() - 查询结果的数量
(3)修改:
db.<collection>.update(查询条件, 修改为新对象) - 默认情况下会使用新对象替换旧的对象。 - 如果需要修改指定的属性,而不是替换为需要使用“修改操作符”来完成修改 - $set 可以用来修改文档中的指定属性 - $unset 删除一个属性 - update 默认只会修改一个 db.stus.update({name:"孙悟空"},{age:500}) - 这会将旧的数据替换为 {age:500} 对象 db.stus.update({name:"孙悟空",age:18,gender:"男"},{name:"孙悟空",age:500,gender:"男"}) - 将数据的age改为500 updateOne() - 修改一个文档,3.2版本以后支持 updateMany() - 修改多个文档,3.2版本以后支持 replaceOne() - 替换一个文档
(4)删除:
db.<collection>.remove(查询条件) - 删除符合条件的所有文档 db.<collection>.remove(查询条件, true) - 删除符合条件的一个文档 db.<collection>.remove({}) - 删除所有文档,性能略差,直接删除集合 db.<collection>.drop() db.<collection>.deleteOne(查询条件) - 删除一个文档 db.<collection>.deleteMany(查询条件) - 删除多个文档 db.dropDatabase() - 删除数据库
文档之间的关系:
(1)一对一(one to one):- 在MongoDB中可以通过内嵌文档的形式来提现一对一的关系。 - db.wifeAndHusband.insert({name:"黄蓉",husband:{name:"郭靖"}})
(2)一对多(one to many)
- 通过内嵌文档的方式映射一对多的关系 - db.usersAndOrders.insert({name:"张三",orders:[{orderNum:"111111"},{orderNum:"222222222222"}]})
(3)多对多(many to many)
_sort 和 投影:
db.stus.find()查询文档时,默认情况是按照 _id 的值进行升序排序
db.stus.find().sort(排序规则)
sort() 可以用来指定文档的排序规则,sort() 需要传递一个对象来制定规则, 1表示升序, -1表示降序
db.stus.find().sort({age:1,name:-1})
可以指定多个排序规则
limit, sort, skip 可以以任意的顺序进行调用
db.stus.find({},{name:1,_id:0,age:1})
在查询时,可以在第二个参数位置来设置查询结果,投影,上述例子查询的只有name,age 列的数据
Mongoose
Mongoose是一个让我们可以通过Node来操作MongoDB的模块。
Mongoose是一个对象文档模型(ODM)库,它对Node原生的MongoDB模块进行了进一步的优化封装,并提供了更多的功能。
在多数情况下,它被用来把结构化的模式应用到一个MongoDB集合,并提供了验证和类型转换等好处。
好处:
1. 可以为文档创建一个模式结构(Schema)
2. 可以对模型中的对象/文档进行验证
3. 数据可以通过类型转换转换为对象模型
4. 可以使用中间件来应用业务逻辑挂钩
5. 比Node原生的MongoDB驱动更容易
新的对象:
1. Schema(模式对象)
- Schema对象定义约束了数据库中的文档结构
2. Model - Model对象作为集合中的所有文档的表示,相当于MongoDB数据库中的集合collection 3. Document Document表示集合中的具体文档,相当于集合中的一个具体的文档
这个三个对象的创建是有顺序的:先创建Schema,再创建Model,后创建Document
使用步骤:
1. 下载安装Mongoose:
npm i mongoose --save
2. 在项目中引入mongoose:
var mongoose = require("mongoose");
3. 连接MongoDB数据库:
mongoose.connect('mongodb://localhost:27017/test', {useNewUrlParser: true, useUnifiedTopology: true});
如果端口是默认端口号(27017),则可以不写
4. 断开数据库连接:
mongoose.disconnect()
监听MongoDB数据库的连接状态 - 在mongoose对象中,有一个属性叫connection,该对象表示的就是数据库连接, 通过监视该对象的状态,可以来监听数据库的连接与断开。 1. 数据库连接成功的事件: mongoose.connection.once("open",function(){}); 2. 数据库断开的事件: mongoose.connection.once("close",function(){});