MongoDB
删除node-module
rm-rf node-module
什么是数据库
数据库是按照数据结构来组织、存储和管理数据的仓库
数据库分类:
- 关系型
- 非关系型
MongoDB的存储格式是bson
文档型数据这个名字中,“文档”两个字很容易误解。其实这个文档就是 bson 。bson 是
json 的超集,比如 json 中没法储存二进制类型,而 bson 拓展了类型,提供了二进制支持。MongoDB中存储的一条条记录都可以用bson来表示,所以也可以认为MongoDB是个存bson数据的数据库
MongoDB的优点
它的特点是高性能,易部署,易使用,存储数据非常方便。主要功能特性有
- 面向集存储 易存储对象类型的数据
- 模式自由
- 支持动态查询
- 支持完全索引
- 支持查询。
- 支持复制和故障恢复。
- 使用高效的二进制数据存储,包括大型对象(如视频等)。
- 自动处理碎片,以支持云计算层次的扩展性
- 支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
- 文件存储格式为BSON(一种JSON的扩展)
1.数据库功能是用来存储数据的
2.数据库分为关系型和非关系型数据库
3.关系型数据库是由表和表之间的关系组成的。nosql是由集合组成的,集合下面是很多的文档
4.非关系型数据库文件存储格式为BSON(json的超级)
MongoDB下载与安装
MongoDB官网地址:
https://www.mongodb.com/
MongoDB下载地址:
https://www.mongodb.com/download-center#community
没有data和log目录的 创建文件夹
1.在d盘建立一个文件夹mongodb,并且建立子目录db和log.
2.在log目录下建立一个文件MongoDB.log ,后缀为.log.
d:\mongodb\db、d:\mongodb\log, 分别用来存放数据库文件和数据库日志文件.
3、把mongodb文件夹的只读属性去掉。
启动MongoDB
以管理员身份运行cmd.exe,进入dos命令界面,执行下列命令
mongod --storageEngine mmapv1 --dbpath “d:\mongodb\db” --logpath
“d:\mongodb\log\MongoDB.log”
执行后,就挂起了,需要另外开命令窗口测试是否启动成功。
测试连接
原来的cmd窗口不关闭,以管理员身份再开一个cmd窗口,输入mongo或者mongo.exe,出现如下信息说明测试通过,此时我们已经进入了test这个数据库。
从上图可以看出,我们进入了mongodb的shell
输入exit或者ctrl+C可退出。
将MongoDB安装为windows服务
1.以管理员身份运行cmd,进入bin文件夹,执行下列命令
mongod --storageEngine mmapv1 --dbpath “d:\mongodb\db” --logpath
“d:\mongodb\log\MongoDB.log” --install --serviceName “MongoDB”
2.这里MongoDB.log就是开始建立的日志文件,–serviceName “MongoDB” 服务名为MongoDB
接着启动mongodb服务
> NET START MongoDB
- 打开任务管理器,可以看到进程已经启动。
再次测试连接
mongo
MongoDB常用命令
- help 查看帮助
- show dbs 显示数据库列表
- use dbname 创建数据库
数据库的增删改查
增加数据
- db.web.save({name:‘lisa’})
- db.web.insert({name:‘huahua’,age:10})
save()和insert()也存在着些许区别:若新增的数据主键已经存在,insert()会不做操作并提示错误,而save() 则更改原来的内容为新的内容
_id是主键,主键是每条数据的唯一标识,不能重复,就像身份证是每个人唯一的编号一样??
删除数据
- db.web.remove({}):删除web集合下的所有是数据
- db.web.remove({name:‘lisa’}):删除web集合下name为lisa的数据
- db.runCommand({“dropDatabase”: 1}) 删除当前数据库,注意 此处的1没加双引号。
修改数据 - db.web.updata({})
查找数据
- db.users.find({}) 查找users集合中所有数据
- db.users.findOne() 查找users集合中的第一条数据
- db.users.find().pretty() 格式化查询到的数据
条件查找:
db.collection.find({ “key” : value }) 查找key=value的数据.
db.collection.find({ “key” : { $gt: value } }) key > value
db.collection.find({ “key” : { $lt: value } }) key < value
db.collection.find({ “key” : { $gte: value } }) key >= value
db.collection.find({ “key” : { $gt: value1 , $lt: value2 } }) value1 < key <value2
db.collection.find({ “key” : { $nin: [ 1, 2, 3 ] } }) 不属于,条件相当于key的值不属于[
1, 2, 3 ]中任何一个。
排序
db.collection.find().sort({ “key1” : -1 ,“key2” : 1 }) 这里的1代表升序,-1代表降序
skip 从下标为几的开始截取
limit 截取几个
express-项目改造
1.安装生成器
npx express -e mongoose-demo
进入生成器目录
2.进入目录后安装依赖 npm i
进行api的接口暴露
- 在routers里面打造接口
- 引入express
- 打造路由对象
- 导出模块
- 暴露接口{
router
.route('/position')
.post()
.delete()
.put()
.get()
}
2.在app.js里引用模块
3.中间件
4.先启动项目测试该接口是否能够测试成功
将express项目改造成 RMVC 架构
1.MVC:是一种软件架构
M:Model 数据
V:View 视图
C:Controller 控制器 (控制器用于写逻辑控制)
- 改造理由:
现在流行分布式,前后端分离,微服务
- 将没有部分进行分块处理,
流程:
1。新建文件夹:model和controller
2.一个控制器一个model
3.把position里面post里面的东西写到(路由只创造路由,不做其他的事情)
4,在控制器里面新建position-controller.js(命名要方便查找)
5.在positionController.js里面打造模块
- const positionController={
add({res}){
positionModel.add({res})},
del(){},
update(){},
query(){}
}
6.导出该模块
module.exports=positionController
7.因为在router打造接口的时候需要post,所以要把这个模块引进去
8.在position.js里面
const positionController=require('../controller/positionController')
.post((req,res,next)=>{
positionController.add({req,res,next}) // add里面要传参数
// 对象传参的好处:
对象是无序的
还可以按需使用参数
positionController才能够接收到res.json
})
9.控制器里面操作的是逻辑不应该操作数据所以要把控制器里面数据操作的部分写到model里面(add里面的内容)
10.在model里面positionModel
const positionModel={
add({res}){{res}},
del(){},
update(){},
query(){}
}
module.exports=positionModel
11.在positionController里面引用
const positionModel=require(‘positionModel的路径’)
12.model是用来操作数据的所以相关于数据库的操作要新建文件夹写关于数据库的操作
13.新建db 里面新建index.js
index.js里面做数据库的操作
到此已经改造好了一个express的项目
接着是封装数据库
1.安装mongoose
需要在mongoose-demo安装
npm i mongoose -S
```![]()
2.连接数据库
- 在db里面新建一个connect.js用于连接数据库
在connect.js
const mongoose=require(‘mongoos’)
mongoose.connerct(url,callback) // url:是cmd中mongo命令的地址
// 回调是一个错误优先的回调const connect={// 运行上面代码
run (){mongoose.connect( mongodb://127.0.0.1:27017/${ dbName }, ( error ) => {
if( error ) console.log( ‘error is:’ + error )
console.log(‘The database is connected~~~’)
}
}
}module.exports=connect
3.在index中导入
在index里面进行数据库操作
const connect = require( ‘./connect’ )
connect.run()
// 2. 创建骨架
const { positionSchema } = require( ‘./schema/index.js’ )
// 3. 创建模型
const { dbPositionModel } = require( ‘./model/index.js’ )
const position_model = dbPositionModel( {
collectionName: ‘positions’,
schemaName: positionSchema
})
4.因为骨架和模型都是多个的所以在db新建文件夹 schema(骨架)和model(模型)
5.schema(骨架):
(里面的index.js用于统一管理骨架)
![]()
5.1 positionSchema.js里面
const mongoose=require(‘mongoose’)
const positionSchema=mongoose.Schema({
// 定义字段和字段类型positionName: String,
city: String,
companyName: String
})
module.exports = positionSchema})
5.2 在index.js中引入骨架
/*
这个文件用于同一管理所有的schema
*/
const positionSchema = require(’./positionSchema’)
module.exports = {
positionSchema
}
6.model(模型)
![]()
dbpositionModel.js
```sho
/*
关于position的模型
*/
const mongoose = require( 'mongoose' )
const dbPositionModel = ({ collectionName, schemaName }) => {
// mongoose.model( 集合名称,骨架 )
//一定要注意: 集合名称一定要写成复数
return mongoose.model( collectionName,schemaName )
}
module.exports = dbPositionModel
index.js
const dbPositionModel = require( './dbPositionModel' )
module.exports = {
dbPositionModel
}