mongodb數(shù)據(jù)庫
數(shù)據(jù)庫概述及環(huán)境搭建
為什么要使用數(shù)據(jù)庫
動態(tài)網(wǎng)站中的數(shù)據(jù)都是存儲在數(shù)據(jù)庫中的
數(shù)據(jù)庫可以用來持久存儲客戶端通過表單收集的用戶信息
數(shù)據(jù)庫軟件本身可以對數(shù)據(jù)進行高效的管理
什么是數(shù)據(jù)庫
數(shù)據(jù)庫即存儲數(shù)據(jù)的倉庫,可以將數(shù)據(jù)進行有序的分門別類的存儲废麻。它是獨立于語言之外的軟件荠卷,可以通過API去操作它。
常見的數(shù)據(jù)庫軟件有:mysql烛愧、mongoDB油宜、oracle掂碱。
MongoDB數(shù)據(jù)庫下載安裝
下載地址:https://www.mongodb.com/download-center
MongoDB可視化軟件
MongoDB可視化操作軟件,是使用圖形界面操作數(shù)據(jù)庫的一種方式验庙。
數(shù)據(jù)庫相關(guān)概念
在一個數(shù)據(jù)庫軟件中可以包含多個數(shù)據(jù)倉庫顶吮,在每個數(shù)據(jù)倉庫中可以包含多個數(shù)據(jù)集合,每個數(shù)據(jù)集合中可以包含多條文檔(具體的數(shù)據(jù))
關(guān)于端口號的總結(jié)
端口號:1--65535粪薛,不建議使用1--199的端口號悴了,這些是預(yù)留給系統(tǒng)的,一般使用4位的违寿,4位的也不要用1開頭的湃交。
常見端口號:
21端口:FTP 文件傳輸服務(wù)
22端口:SSH 端口
23端口:TELNET 終端仿真服務(wù)
25端口:SMTP 簡單郵件傳輸服務(wù)
53端口:DNS 域名解析服務(wù)
80端口:HTTP 超文本傳輸服務(wù)
110端口:POP3 “郵局協(xié)議版本3”使用的端口
443端口:HTTPS 加密的超文本傳輸服務(wù)
1433端口:MS SQL*SERVER數(shù)據(jù)庫 默認(rèn)端口號
1521端口:Oracle數(shù)據(jù)庫服務(wù)
1863端口:MSN Messenger的文件傳輸功能所使用的端口
3306端口:MYSQL 默認(rèn)端口號
3389端口:Microsoft RDP 微軟遠(yuǎn)程桌面使用的端口
5631端口:Symantec pcAnywhere 遠(yuǎn)程控制數(shù)據(jù)傳輸時使用的端口
5632端口:Symantec pcAnywhere 主控端掃描被控端時使用的端口
5000端口:MS SQL Server使用的端口
27017端口:MongoDB實例默認(rèn)端口
MongoDB連接本地數(shù)據(jù)庫
在mongodb安裝所在目錄bin目錄下執(zhí)行 mongo --host=127.0.0.1 --port=27017
MongoDB基本命令
1. db : 查看當(dāng)前在操作哪一個數(shù)據(jù)庫
2. show dbs :查看數(shù)據(jù)庫列表(一共有幾個數(shù)據(jù)庫,備注:如果數(shù)據(jù)庫為空藤巢,不出現(xiàn)在列表中)
3. use test :切換到test數(shù)據(jù)庫搞莺,如果不存在,則創(chuàng)建一個test庫
4. db.students.insert({}) :向當(dāng)前數(shù)據(jù)庫的students集合中插入一個文檔掂咒。
5. show collections :展示當(dāng)前數(shù)據(jù)庫中所有的集合才沧。
MongoDB原生CRUD(增刪改查)命令總結(jié)
-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的學(xué)生
常用操作符:
1. < , <= , > , >= , !== 對應(yīng)為: $lt $lte $gt $gte $ne
舉例:db.集合名.find({age:{$gte:20}}),年齡是大于等于20的
2.邏輯或:使用$in 或 $or
查找年齡為18或20的學(xué)生
舉例: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能寫函數(shù):
db.students.find({$where:function(){
return this.name === 'zhangsan' && this.age === 18
}})
投影:過濾掉不想要的數(shù)據(jù)绍刮,只保留想要展示的數(shù)據(jù)
舉例:db.students.find({},{_id:0,name:0}),過濾掉id和name
舉例:db.students.find({},{age:1}),只保留age
補充:db.集合名.findOne(查詢條件[,投影])温圆,默認(rèn)只要找到一個
-U update:
db.集合名.update(查詢條件,要更新的內(nèi)容[,配置對象])
//如下會將更新內(nèi)容替換掉整個文檔對象,但_id不受影響
舉例:db.students.update({name:'zhangsan'},{age:19})
//使用$set修改指定內(nèi)容孩革,其他數(shù)據(jù)不變岁歉,不過只能匹配一個zhangsan
舉例:db.students.update({name:'zhangsan'},{$set:{age:19}})
//修改多個文檔對象,匹配多個zhangsan,把所有zhangsan的年齡都替換為19
舉例:db.students.update({name:'zhangsan'},{$set:{age:19}},{multi:true})
補充:db.集合名.updateOne(查詢條件,要更新的內(nèi)容[,配置對象])
db.集合名.updateMany(查詢條件,要更新的內(nèi)容[,配置對象])
-D delete
db.集合名.remove(查詢條件)
//刪除所有年齡小于等于19的學(xué)生
舉例:db.students.remove({age:{$lte:19}})
mongoose的基本使用
/*
* mongoDB:一個非關(guān)系型數(shù)據(jù)庫的名稱
* mongod:啟動mongo服務(wù)的命令
* mongo:連接數(shù)據(jù)庫的命令
* mongoose:在Node端連接數(shù)據(jù)庫的一個框架
* */
//1.引入mongoose
let mongoose = require('mongoose')
let dbPromise = new Promise((resolve, reject) => {
//2.連接數(shù)據(jù)庫
mongoose.connect('mongodb://localhost:27017/demo', {
useNewUrlParser: true,
useUnifiedTopology: true
})
//3.監(jiān)聽連接狀態(tài)
mongoose.connection.on('open', (err) => {
if (!err) {
console.log('數(shù)據(jù)庫連接成功了膝蜈!')
resolve()
} else {
reject(err)
}
})
})
//第一種寫法
/*dbPromise.then(()=>{
//4.操作數(shù)據(jù)庫的代碼
console.log(1)
},(err)=>{
console.log(err)
})*/
//第二種寫法
/*dbPromise
.then(()=>{
//4.操作數(shù)據(jù)庫的代碼
console.log(1)
}).catch((err)=>{
console.log(err)
})*/
//第三種寫法
;
(async () => {
//等待數(shù)據(jù)庫連接成功
await dbPromise
//4.操作數(shù)據(jù)庫的代碼
console.log(1)
})()
mongoose的CRUD操作
//引入mongoose
let mongoose = require('mongoose')
mongoose.set('useCreateIndex',true)
//定義數(shù)據(jù)庫名
const DB_NAME = 'demo'
//定義數(shù)據(jù)庫地址
const DB_URL = 'localhost:27017'
//構(gòu)建一個Promise實例锅移,用于管理數(shù)據(jù)庫連接
let dbPromise = new Promise((resolve,reject)=>{
//2.連接數(shù)據(jù)庫
mongoose.connect(`mongodb://${DB_URL}/${DB_NAME}`,{useNewUrlParser:true,useUnifiedTopology: true})
//3.監(jiān)聽連接狀態(tài)
mongoose.connection.on('open',(err)=>{
if(!err){
console.log('數(shù)據(jù)庫連接成功了!')
resolve()
}else{
reject(err)
}
})
})
//具體業(yè)務(wù)邏輯
;(async()=>{
//等待數(shù)據(jù)庫連接成功
await dbPromise
//操作數(shù)據(jù)庫
//1.請來一個保安 ------- 引入約束Schema
let Schema = mongoose.Schema
//2.制定一個進入你家的規(guī)則 -------- 創(chuàng)建一個約束對象實例
let studentSchema = new Schema({
stu_id:{
type:String,
required:true,//限制學(xué)號是必填信息
unique:true//限制學(xué)號是唯一的
},
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' //默認(rèn)啟用該用戶
}
})
/*3.告訴保安你的規(guī)則 ------- 創(chuàng)建模型對象
第一個參數(shù)與數(shù)據(jù)庫中的集合相對應(yīng)饱搏,第二個參數(shù)指定約束對象實例
只要生成了模型對象非剃,就可以進行數(shù)據(jù)的:增刪改查*/
let studentModel = mongoose.model('students',studentSchema)
//4.操作數(shù)據(jù)庫(增刪改查)
//新增數(shù)據(jù)
/*let createResult = await studentModel.create({
stu_id:'20190722004',
name:'zhanchujin',
age:22,
sex:'男',
hobby:['打代碼','吃飯','睡覺'],
info:'一個非常帥氣的男人',
})
console.log(createResult);*/
//查詢數(shù)據(jù)庫
/*studentModel.findOne({age:90},{name:1,_id:0},(err,data)=>{
if(!err){
console.log(data)
}else{
console.log(err)
}
})*/
//更新數(shù)據(jù)
/*let updateResult = await studentModel.updateMany({age:90},{sex:'男'},{multi:true})
console.log(updateResult);*/
//刪除數(shù)據(jù)
/*await studentModel.deleteMany({age:90})*/
})()
mongoose的CRUD方法總結(jié)
-Create
模型對象.create(文檔對象,回調(diào)函數(shù))
模型對象.create(文檔對象)
-Read
模型對象.find(查詢條件[,投影])不管有沒有數(shù)據(jù)推沸,都返回一個數(shù)組
模型對象.findOne(查詢條件[,投影])找到了返回一個對象备绽,沒找到返回null
-Update
模型對象.updateOne(查詢條件,要更新的內(nèi)容[,配置對象])
模型對象.updateMany(查詢條件,要更新的內(nèi)容[,配置對象])
備注:存在update方法,但是即將廢棄坤学,查詢條件匹配到多個時疯坤,依然只修改一個,強烈建議用updateOne或updateMany
-Delete
模型對象.deleteOne(查詢條件)
模型對象.deleteMany(查詢條件)
備注:沒有delete方法深浮,會報錯压怠!
備注: 以上所有方法,如果沒有指定回調(diào)函數(shù)飞苇,則返回值是一個Promise對象
mongoose模塊化編碼
db/index.js
/*
* 該模塊用于連接數(shù)據(jù)庫菌瘫,暴露出去一個Promise實例
* 如果連接成功了蜗顽,Promise實例內(nèi)部狀態(tài)切換為成功
* 如果連接失敗了,Promise實例內(nèi)部狀態(tài)切換為失敗
* */
//引入mongoose
let mongoose = require('mongoose')
mongoose.set('useCreateIndex',true)
//定義數(shù)據(jù)庫名
const DB_NAME = 'demo'
//定義數(shù)據(jù)庫地址
const DB_URL = 'localhost:27017'
//構(gòu)建一個Promise實例雨让,用于管理數(shù)據(jù)庫連接
module.exports = new Promise((resolve,reject)=>{
//2.連接數(shù)據(jù)庫
mongoose.connect(`mongodb://${DB_URL}/${DB_NAME}`,{useNewUrlParser:true })
//3.監(jiān)聽連接狀態(tài)
mongoose.connection.on('open',(err)=>{
if(!err){
console.log(`位于${DB_URL}上的${DB_NAME}數(shù)據(jù)庫連接成功`)
resolve()
}else{
reject(err)
}
})
})
model/studentModel.js
/*
* 該模塊主要負(fù)責(zé)創(chuàng)建學(xué)生模型
* */
let mongoose = require('mongoose')
//操作數(shù)據(jù)庫
//1.請來一個保安 ------- 引入約束Schema
let Schema = mongoose.Schema
//2.制定一個進入你家的規(guī)則 -------- 創(chuàng)建一個約束對象實例
let studentSchema = new Schema({
stu_id:{
type:String,
required:true,//限制學(xué)號是必填信息
unique:true//限制學(xué)號是唯一的
},
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.告訴保安你的規(guī)則 ------- 創(chuàng)建模型對象
第一個參數(shù)與數(shù)據(jù)庫中的集合相對應(yīng)雇盖,第二個參數(shù)指定約束對象實例
只要生成了模型對象,就可以進行數(shù)據(jù)的:增刪改查*/
module.exports = mongoose.model('students',studentSchema)
model/teacherModel.js
/*
* 該模塊主要負(fù)責(zé)創(chuàng)建教師模型
* */
let mongoose = require('mongoose')
//操作數(shù)據(jù)庫
//1.請來一個保安 ------- 引入約束Schema
let Schema = mongoose.Schema
//2.制定一個進入你家的規(guī)則 -------- 創(chuàng)建一個約束對象實例
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.告訴保安你的規(guī)則 ------- 創(chuàng)建模型對象
第一個參數(shù)與數(shù)據(jù)庫中的集合相對應(yīng)栖忠,第二個參數(shù)指定約束對象實例
只要生成了模型對象崔挖,就可以進行數(shù)據(jù)的:增刪改查*/
module.exports = mongoose.model('teachers',teacherSchema)
test.js
//引入數(shù)據(jù)庫連接模塊
let db = require('./db')
//引入學(xué)生模型
let studentModel = require('./model/studentModel')
//引入教師模型
let teacherModel = require('./model/teacherModel')
;(async()=>{
//等待數(shù)據(jù)庫連接成功
await db
//操作數(shù)據(jù)庫
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原生服務(wù)器
//1.引入http模塊 ----- http是Node中的核心模塊,無需下載庵寞,引入即可使用狸相。
let http = require('http')
let {parse} = require('querystring')
//2.創(chuàng)建server對象
let server = http.createServer(function (request,response) {
/*
* request:請求對象 -------- 客戶端發(fā)給服務(wù)器
* response:響應(yīng)對象 ------- 服務(wù)器給客戶端
* */
//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.綁定端口監(jiān)聽
server.listen(3000,function (err) {
if(!err){
console.log('服務(wù)器啟動成功了')
}else{
console.log(err)
}
})