mongodb数据库
数据库概述及环境搭建
为什么要使用数据库
动态网站中的数据都是存储在数据库中的
数据库可以用来持久存储客户端通过表单收集的用户信息
数据库软件本身可以对数据进行高效的管理
什么是数据库
数据库即存储数据的仓库,可以将数据进行有序的分门别类的存储。它是独立于语言之外的软件,可以通过API去操作它。
常见的数据库软件有:mysql、mongoDB、oracle。
MongoDB数据库下载安装
下载地址:https://www.mongodb.com/download-center
MongoDB可视化软件
MongoDB可视化操作软件,是使用图形界面操作数据库的一种方式。
数据库相关概念
在一个数据库软件中可以包含多个数据仓库,在每个数据仓库中可以包含多个数据集合,每个数据集合中可以包含多条文档(具体的数据)
关于端口号的总结
端口号:1--65535,不建议使用1--199的端口号,这些是预留给系统的,一般使用4位的,4位的也不要用1开头的。
常见端口号:
21端口:FTP 文件传输服务
22端口:SSH 端口
23端口:TELNET 终端仿真服务
25端口:SMTP 简单邮件传输服务
53端口:DNS 域名解析服务
80端口:HTTP 超文本传输服务
110端口:POP3 “邮局协议版本3”使用的端口
443端口:HTTPS 加密的超文本传输服务
1433端口:MS SQL*SERVER数据库 默认端口号
1521端口:Oracle数据库服务
1863端口:MSN Messenger的文件传输功能所使用的端口
3306端口:MYSQL 默认端口号
3389端口:Microsoft RDP 微软远程桌面使用的端口
5631端口:Symantec pcAnywhere 远程控制数据传输时使用的端口
5632端口:Symantec pcAnywhere 主控端扫描被控端时使用的端口
5000端口:MS SQL Server使用的端口
27017端口:MongoDB实例默认端口
MongoDB连接本地数据库
在mongodb安装所在目录bin目录下执行 mongo --host=127.0.0.1 --port=27017
MongoDB基本命令
1. db : 查看当前在操作哪一个数据库
2. show dbs :查看数据库列表(一共有几个数据库,备注:如果数据库为空,不出现在列表中)
3. use test :切换到test数据库,如果不存在,则创建一个test库
4. db.students.insert({}) :向当前数据库的students集合中插入一个文档。
5. show collections :展示当前数据库中所有的集合。
MongoDB原生CRUD(增删改查)命令总结
-C creat:
db.集合名.insert(文档对象)
db.集合名.insertOne(文档对象)
db.集合名.insertMany([文档对象,文档对象])
-R read:
db.集合名.find(查询条件[,投影])
举例:db.students.find({age:18}),查找年龄为18的所有信息
举例:db.students.find({age:18,name:'jack'}),查找年龄为18且名字为jack的学生
常用操作符:
1. < , <= , > , >= , !== 对应为: $lt $lte $gt $gte $ne
举例:db.集合名.find({age:{$gte:20}}),年龄是大于等于20的
2.逻辑或:使用$in 或 $or
查找年龄为18或20的学生
举例:db.students.find({age:{$in:[18,20]}})
举例:db.students.find({$or:[{age:18},{age:20}]})
3.逻辑非:$nin
4.正则匹配:
举例:db.students.find({name:/^T/})
5.$where能写函数:
db.students.find({$where:function(){
return this.name === 'zhangsan' && this.age === 18
}})
投影:过滤掉不想要的数据,只保留想要展示的数据
举例:db.students.find({},{_id:0,name:0}),过滤掉id和name
举例:db.students.find({},{age:1}),只保留age
补充:db.集合名.findOne(查询条件[,投影]),默认只要找到一个
-U update:
db.集合名.update(查询条件,要更新的内容[,配置对象])
//如下会将更新内容替换掉整个文档对象,但_id不受影响
举例:db.students.update({name:'zhangsan'},{age:19})
//使用$set修改指定内容,其他数据不变,不过只能匹配一个zhangsan
举例:db.students.update({name:'zhangsan'},{$set:{age:19}})
//修改多个文档对象,匹配多个zhangsan,把所有zhangsan的年龄都替换为19
举例:db.students.update({name:'zhangsan'},{$set:{age:19}},{multi:true})
补充:db.集合名.updateOne(查询条件,要更新的内容[,配置对象])
db.集合名.updateMany(查询条件,要更新的内容[,配置对象])
-D delete
db.集合名.remove(查询条件)
//删除所有年龄小于等于19的学生
举例:db.students.remove({age:{$lte:19}})
mongoose的基本使用
/*
* mongoDB:一个非关系型数据库的名称
* mongod:启动mongo服务的命令
* mongo:连接数据库的命令
* mongoose:在Node端连接数据库的一个框架
* */
//1.引入mongoose
let mongoose = require('mongoose')
let dbPromise = new Promise((resolve, reject) => {
//2.连接数据库
mongoose.connect('mongodb://localhost:27017/demo', {
useNewUrlParser: true,
useUnifiedTopology: true
})
//3.监听连接状态
mongoose.connection.on('open', (err) => {
if (!err) {
console.log('数据库连接成功了!')
resolve()
} else {
reject(err)
}
})
})
//第一种写法
/*dbPromise.then(()=>{
//4.操作数据库的代码
console.log(1)
},(err)=>{
console.log(err)
})*/
//第二种写法
/*dbPromise
.then(()=>{
//4.操作数据库的代码
console.log(1)
}).catch((err)=>{
console.log(err)
})*/
//第三种写法
;
(async () => {
//等待数据库连接成功
await dbPromise
//4.操作数据库的代码
console.log(1)
})()
mongoose的CRUD操作
//引入mongoose
let mongoose = require('mongoose')
mongoose.set('useCreateIndex',true)
//定义数据库名
const DB_NAME = 'demo'
//定义数据库地址
const DB_URL = 'localhost:27017'
//构建一个Promise实例,用于管理数据库连接
let dbPromise = new Promise((resolve,reject)=>{
//2.连接数据库
mongoose.connect(`mongodb://${DB_URL}/${DB_NAME}`,{useNewUrlParser:true,useUnifiedTopology: true})
//3.监听连接状态
mongoose.connection.on('open',(err)=>{
if(!err){
console.log('数据库连接成功了!')
resolve()
}else{
reject(err)
}
})
})
//具体业务逻辑
;(async()=>{
//等待数据库连接成功
await dbPromise
//操作数据库
//1.请来一个保安 ------- 引入约束Schema
let Schema = mongoose.Schema
//2.制定一个进入你家的规则 -------- 创建一个约束对象实例
let studentSchema = new Schema({
stu_id:{
type:String,
required:true,//限制学号是必填信息
unique:true//限制学号是唯一的
},
name:{
type:String,
required:true,
},
age:{
type:Number,
required:true,
},
sex:{
type:String,
required:true,
},
hobby:[String],
info:{
type:Schema.Types.Mixed //接收所有类型
},
date:{
type:Date,
default:Date.now()
},
enable_flag:{
type:String,
default:'Y' //默认启用该用户
}
})
/*3.告诉保安你的规则 ------- 创建模型对象
第一个参数与数据库中的集合相对应,第二个参数指定约束对象实例
只要生成了模型对象,就可以进行数据的:增删改查*/
let studentModel = mongoose.model('students',studentSchema)
//4.操作数据库(增删改查)
//新增数据
/*let createResult = await studentModel.create({
stu_id:'20190722004',
name:'zhanchujin',
age:22,
sex:'男',
hobby:['打代码','吃饭','睡觉'],
info:'一个非常帅气的男人',
})
console.log(createResult);*/
//查询数据库
/*studentModel.findOne({age:90},{name:1,_id:0},(err,data)=>{
if(!err){
console.log(data)
}else{
console.log(err)
}
})*/
//更新数据
/*let updateResult = await studentModel.updateMany({age:90},{sex:'男'},{multi:true})
console.log(updateResult);*/
//删除数据
/*await studentModel.deleteMany({age:90})*/
})()
mongoose的CRUD方法总结
-Create
模型对象.create(文档对象,回调函数)
模型对象.create(文档对象)
-Read
模型对象.find(查询条件[,投影])不管有没有数据,都返回一个数组
模型对象.findOne(查询条件[,投影])找到了返回一个对象,没找到返回null
-Update
模型对象.updateOne(查询条件,要更新的内容[,配置对象])
模型对象.updateMany(查询条件,要更新的内容[,配置对象])
备注:存在update方法,但是即将废弃,查询条件匹配到多个时,依然只修改一个,强烈建议用updateOne或updateMany
-Delete
模型对象.deleteOne(查询条件)
模型对象.deleteMany(查询条件)
备注:没有delete方法,会报错!
备注: 以上所有方法,如果没有指定回调函数,则返回值是一个Promise对象
mongoose模块化编码
db/index.js
/*
* 该模块用于连接数据库,暴露出去一个Promise实例
* 如果连接成功了,Promise实例内部状态切换为成功
* 如果连接失败了,Promise实例内部状态切换为失败
* */
//引入mongoose
let mongoose = require('mongoose')
mongoose.set('useCreateIndex',true)
//定义数据库名
const DB_NAME = 'demo'
//定义数据库地址
const DB_URL = 'localhost:27017'
//构建一个Promise实例,用于管理数据库连接
module.exports = new Promise((resolve,reject)=>{
//2.连接数据库
mongoose.connect(`mongodb://${DB_URL}/${DB_NAME}`,{useNewUrlParser:true })
//3.监听连接状态
mongoose.connection.on('open',(err)=>{
if(!err){
console.log(`位于${DB_URL}上的${DB_NAME}数据库连接成功`)
resolve()
}else{
reject(err)
}
})
})
model/studentModel.js
/*
* 该模块主要负责创建学生模型
* */
let mongoose = require('mongoose')
//操作数据库
//1.请来一个保安 ------- 引入约束Schema
let Schema = mongoose.Schema
//2.制定一个进入你家的规则 -------- 创建一个约束对象实例
let studentSchema = new Schema({
stu_id:{
type:String,
required:true,//限制学号是必填信息
unique:true//限制学号是唯一的
},
name:{
type:String,
required:true,
},
age:{
type:Number,
required:true,
},
sex:{
type:String,
required:true,
},
hobby:[String],
info:{
type:Schema.Types.Mixed //接收所有类型
},
date:{
type:Date,
default:Date.now()
},
enable_flag:{
type:String,
default:'Y'
}
})
/*3.告诉保安你的规则 ------- 创建模型对象
第一个参数与数据库中的集合相对应,第二个参数指定约束对象实例
只要生成了模型对象,就可以进行数据的:增删改查*/
module.exports = mongoose.model('students',studentSchema)
model/teacherModel.js
/*
* 该模块主要负责创建教师模型
* */
let mongoose = require('mongoose')
//操作数据库
//1.请来一个保安 ------- 引入约束Schema
let Schema = mongoose.Schema
//2.制定一个进入你家的规则 -------- 创建一个约束对象实例
let teacherSchema = new Schema({
teac_id:{
type:String,
required:true,
unique:true
},
name:{
type:String,
required:true,
},
age:{
type:Number,
required:true,
},
sex:{
type:String,
required:true,
},
hobby:[String],
info:{
type:Schema.Types.Mixed //接收所有类型
},
date:{
type:Date,
default:Date.now()
},
enable_flag:{
type:String,
default:'Y'
}
})
/*3.告诉保安你的规则 ------- 创建模型对象
第一个参数与数据库中的集合相对应,第二个参数指定约束对象实例
只要生成了模型对象,就可以进行数据的:增删改查*/
module.exports = mongoose.model('teachers',teacherSchema)
test.js
//引入数据库连接模块
let db = require('./db')
//引入学生模型
let studentModel = require('./model/studentModel')
//引入教师模型
let teacherModel = require('./model/teacherModel')
;(async()=>{
//等待数据库连接成功
await db
//操作数据库
let result = await studentModel.findOne({name:'班长'})
console.log(result);
let result2 = await teacherModel.create({
teac_id:'20190722005',
name:'zhangsan',
age:90,
sex:'男',
hobby:['打代码','吃饭','睡觉'],
info:'一个非常帅气的男人',
})
console.log(result2);
})()
node原生服务器
//1.引入http模块 ----- http是Node中的核心模块,无需下载,引入即可使用。
let http = require('http')
let {parse} = require('querystring')
//2.创建server对象
let server = http.createServer(function (request,response) {
/*
* request:请求对象 -------- 客户端发给服务器
* response:响应对象 ------- 服务器给客户端
* */
//console.log(request.url);
let str = request.url.split('?')[1]
let obj = parse(str)
console.log(obj)
response.setHeader('content-type','text/html;charset=utf-8')
if(obj.name === 'zhangsan'){
response.end('<h2>zhangsan,你好好听课</h2>')
}else if(obj.name === 'lisi'){
response.end('<h2>lisi,你回家吧</h2>')
}else{
response.end('<h2>阿偶,走了丢了</h2>')
}
})
//3.绑定端口监听
server.listen(3000,function (err) {
if(!err){
console.log('服务器启动成功了')
}else{
console.log(err)
}
})