nodejs+mongodb筆記------第三章(mongodb數(shù)據(jù)庫增刪改查源梭、模型對象娱俺、node服務(wù)器搭建)

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)
  }
})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末捐川,一起剝皮案震驚了整個濱河市脓鹃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌古沥,老刑警劉巖瘸右,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異岩齿,居然都是意外死亡太颤,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進店門纯衍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來栋齿,“玉大人苗胀,你說我怎么就攤上這事襟诸。” “怎么了基协?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵歌亲,是天一觀的道長。 經(jīng)常有香客問我澜驮,道長陷揪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任杂穷,我火速辦了婚禮悍缠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘耐量。我一直安慰自己飞蚓,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布廊蜒。 她就那樣靜靜地躺著趴拧,像睡著了一般溅漾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上著榴,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天添履,我揣著相機與錄音,去河邊找鬼脑又。 笑死暮胧,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的问麸。 我是一名探鬼主播叔壤,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼口叙!你這毒婦竟也來了炼绘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤妄田,失蹤者是張志新(化名)和其女友劉穎俺亮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疟呐,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡脚曾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了启具。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片本讥。...
    茶點故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鲁冯,靈堂內(nèi)的尸體忽然破棺而出拷沸,到底是詐尸還是另有隱情,我是刑警寧澤薯演,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布撞芍,位于F島的核電站,受9級特大地震影響跨扮,放射性物質(zhì)發(fā)生泄漏序无。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一衡创、第九天 我趴在偏房一處隱蔽的房頂上張望帝嗡。 院中可真熱鬧,春花似錦璃氢、人聲如沸哟玷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碗降。三九已至隘竭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間讼渊,已是汗流浹背动看。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留爪幻,地道東北人菱皆。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像挨稿,于是被迫代替她去往敵國和親仇轻。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,612評論 2 350