MongoDB數(shù)據(jù)庫入門

數(shù)據(jù)庫概念

數(shù)據(jù)庫介紹

  • 存儲(chǔ)數(shù)據(jù)的倉(cāng)庫,獨(dú)立于語言之外的軟件震嫉,可以通過api去操作它
  • 生活中
    • 通過倉(cāng)庫來存放物品,每個(gè)倉(cāng)庫有N個(gè)架子, 每個(gè)架子有N個(gè)物品
  • 在程序中
    • 通過數(shù)據(jù)庫來存放數(shù)據(jù)抖格, 每個(gè)數(shù)據(jù)庫有N個(gè)表/集合冕房,每個(gè)表/集合有N個(gè)數(shù)據(jù)/文檔

數(shù)據(jù)庫種類

  • 關(guān)系型數(shù)據(jù)庫

    1. 遵循統(tǒng)一的SQL標(biāo)準(zhǔn)生逸,語法大同小異
    2. 有庫和表的約束等
    • Oracle牢屋、 MySql且预、 SQLite、 SQL Server等
  • 非關(guān)系型數(shù)據(jù)庫(Not Only SQL)

    1. 沒有統(tǒng)一的標(biāo)準(zhǔn)

    2. 一般以鍵值對(duì)形式存儲(chǔ)

    3. 讀取速度更快

    • Mongodb(文檔)烙无、Redis/Memcache(內(nèi)存)

為什么使用數(shù)據(jù)庫

  1. 動(dòng)態(tài)網(wǎng)站的數(shù)據(jù)都存儲(chǔ)于數(shù)據(jù)庫中
  2. 可以持久存儲(chǔ)客戶端通過表單收集的用戶信息
  3. 可以對(duì)數(shù)據(jù)進(jìn)行高效的管理

MongoDB中的相關(guān)術(shù)語

  • database: 數(shù)據(jù)庫锋谐,mongodb中可以建立多個(gè)數(shù)據(jù)庫

  • collection:集合,一組數(shù)據(jù)的集合截酷,可以理解為js中的數(shù)組

  • document:文檔涮拗,一條具體的數(shù)據(jù), 可以理解為js中的對(duì)象

  • field:字段迂苛,可以理解為js中的對(duì)象屬性

    field --> document --> collection --> database

目標(biāo)

  1. 存放項(xiàng)目數(shù)據(jù)
  2. 實(shí)戰(zhàn)工作中可以獨(dú)立寫api接口

MongoDB安裝步驟

  • linux環(huán)境

    1. 下載mongodb(linux)安裝包(通過winScp工具將安裝包從window移動(dòng)到linux)

    2. 遠(yuǎn)程工具連接linux(putty等)

    3. 移動(dòng)到安裝包的目錄解壓安裝包

      tar -zxvf mongodb-linux-x86_64-xxxxx.tgz
      
    4. 將解壓包移動(dòng)到指定目錄

      mv mongodb-linux-x86_64-xxxx/ /user/local/mongodb
      
    5. 創(chuàng)建數(shù)據(jù)存放目錄與日志存放目錄

      mkdir -p /user/local/mongodb/data /user/local/mongodb/logs
      
    6. 啟動(dòng)MongoDB服務(wù)

      /user/local/mongodb/bin/mongod --dbpath=/user/local/mongodb/data --logpath=/user/local/mongodb/logs/mongodb.log --logappend --port=27017 --fork
      
    7. 后期登錄即可

      /user/local/mongodb/bin/mongo
      
  • window環(huán)境

    1. 下載mongodb(window)安裝包并解壓

    2. 創(chuàng)建服務(wù)(dos命令窗口中移動(dòng)至安裝包的安裝路徑)

      bin/mongod.exe --install --dbpath 磁盤路徑 --logpath 日志路徑
      
    3. 啟動(dòng)服務(wù)(在mongodb的bin目錄 ===》 以管理員身份運(yùn)行)

      net start mongodb
      net stop mongodb       
      
    4. 登錄(在mongodb的bin目錄 ====》 也可以直接配置環(huán)境變量)

      mongo
      

MongoDB基本操作

查看數(shù)據(jù)庫

show databases

選擇數(shù)據(jù)庫

use 數(shù)據(jù)庫名

注意:在mongodb中選擇不存在的數(shù)據(jù)庫時(shí)不會(huì)報(bào)錯(cuò)(隱式創(chuàng)建)三热,當(dāng)這個(gè)數(shù)據(jù)庫中有內(nèi)容后會(huì)展示

查看當(dāng)前選擇的數(shù)據(jù)庫

db

刪除數(shù)據(jù)庫

db.dropDatabase()

刪除當(dāng)前選擇的數(shù)據(jù)庫

查看集合

show collections

創(chuàng)建集合

db.createCollection('集合名')

注意: 后期插入數(shù)據(jù)都是隱式創(chuàng)建集合

刪除集合

db.xxx.drop()

mongodb文檔增刪改查

數(shù)據(jù)庫主要用來存放項(xiàng)目數(shù)據(jù), 數(shù)據(jù)庫和集合的創(chuàng)建完成之后需要對(duì)文檔(數(shù)據(jù))進(jìn)行增刪改查

插入文檔

  • 語法

    db.集合名.insert(json數(shù)據(jù))
    

    集合若存在三幻,則直接插入數(shù)據(jù)就漾,若集合不存在,則隱式創(chuàng)建

  • 練習(xí):在test2數(shù)據(jù)庫的c1集合中插入數(shù)據(jù)(名字叫yuweiqi 年齡18歲)

    use test2
    db.c1.insert({
      name: "yuweiqi",
      age: 18
    })
    // mongodb會(huì)給每一條文檔加一個(gè)全球唯一的_id鍵
    
    • 可以給每條數(shù)據(jù)自定義_id 但是強(qiáng)烈不推薦

      • 只要在插入數(shù)據(jù)的時(shí)候加上自定義的_id既可覆蓋
    • 插入多條數(shù)據(jù)

      db.c1.insert([
          {name: "zhangsan", age: 18},
          {name: "zhaosi", age: 19},
          {name: "wangwu", age: 20}
      ])
      
      // 一次性插入三條數(shù)據(jù)
      
    • 如何快速插入多條數(shù)據(jù)

      因?yàn)閙ongodb底層使用的是js引擎實(shí)現(xiàn)的念搬,所以支持部分js語法

      因此可以寫for循環(huán)

      for(var i = 0; i < 10; i++) {
          db.c1.insert({name: "a"+ i, age: i})
      }
      

刪除文檔

  • 語法

    db.集合名.remove(條件, [,是否刪除一條])
    
    是否刪除一條: true 刪除全部匹配的   false  刪除一條(默認(rèn))
    

修改文檔

  • 基礎(chǔ)語法

    db.集合名.update(條件抑堡,新數(shù)據(jù)[,是否新增, 是否修改多條])
    
    是否新增: 根據(jù)條件匹配不到數(shù)據(jù)時(shí)是否插入該條數(shù)據(jù)     true為插入  false為不插入(默認(rèn))
    是否修改多條: 將匹配成功的數(shù)據(jù)都修改     true 是  false 否(默認(rèn))
    
  • 升級(jí)語法

    db.集合名.update(條件朗徊,{修改器:{鍵:值}})
    
    修改器 作用
    $inc 遞增
    $rename 重命名列
    $set 修改列值
    $unset 刪除列
  • 準(zhǔn)備工作

    for(var i = 1; i <= 10; i++) {
        db.c2.insert({uname: "zs"+i, age: i})
    }
    在test2數(shù)據(jù)庫的c2集合中插入10條數(shù)據(jù)
    
  • 練習(xí)1:將{uname: zs1}改為{uname: zs2}

    db.c2.update({uname: "zs2"}, {$set: {uname: "zs22"}})
    
  • 練習(xí)2:將{uname: zs10}的年齡增加兩歲或者減小兩歲

    db.c2.update({uname: "zs10"}, {$inc: {age: 2}})  增加兩歲
    db.c2.update({uname: "zs10"}, {$inc: {age: -2}}) 減小兩歲
    
  • 練習(xí)3:插入數(shù)據(jù): db.c2.insert({uname: "升龍教主"首妖,age: 888, who: "男"荣倾, other:“非國(guó)人”})

    db.c2.update({uname: "升龍教主"}, {$set: {uname: "升龍大教主"}})  修改uname的值
    db.c2.update({uname: "升龍大教主"}, {$rename: {who: "sex"}})   修改who字段的字段名
    db.c2.update({uname: "升龍大教主"}, {$inc: {age: 111}})      age字段的值增加111
    db.c2.update({uname: "升龍大教主"}, {$unset: {other: true}})   刪除other字段
    
    
    // 一次性寫多個(gè)修改器
    db.c2.update({uname: "升龍大教主"}, {
        $set: {uname: "升龍大教主"},
        $rename: {who: "sex"},
        $inc: {age: 111},
        $unset: {other: true}
    }
    

查詢文檔

  • 語法

    db.集合名.find(條件[,查詢的字段])
    
    // 1.條件:
      查詢所有的數(shù)據(jù) ---> {}或者不寫
      查詢 age=6 的數(shù)據(jù) ---> {age: 6}
      查詢age=6 同時(shí) sex = "男"的數(shù)據(jù) ---> {age: 6, sex: "男"}
       
       2.查詢的字段(可選參數(shù))
          不寫 ---> 查詢符合條件數(shù)據(jù)的所有字段
      {age: 1}  ---> 只顯示符合條件數(shù)據(jù)的age字段
      {age: 0}  ---> 不顯示符合條件數(shù)據(jù)的age字段(其他字段都顯示)
      
      但是不管怎么寫 系統(tǒng)自定義的_id都會(huì)顯示
    
    條件 含義
    $gt 大于
    $lt 小于
    $gte 大于等于
    $lte 小于等于
    $ne 不等于
    $in 包含(查詢多個(gè))
    $nin 不包含
  • 練習(xí)1:查詢所有的數(shù)據(jù)

    db.c1.find({})
    
  • 練習(xí)2:查詢年齡大于5歲的數(shù)據(jù)

    db.c1.find({age: {$gt: 5}})
    
  • 練習(xí)3:查詢年齡是5歲、8歲骑丸、10歲的數(shù)據(jù)

    db.c1.find({age: {$in: [5, 8, 10]}})
    
  • 練習(xí)4:只看年齡列(_id不考慮)

    db.c1.find({},{age:1})
    

MongoDB實(shí)戰(zhàn)

排序

  • 語法

    db.集合名.find().sort(JSON數(shù)據(jù))
    
    說明:JSON中鍵時(shí)候需要排序的字段舌仍,  值為1 升序
                                值為-1 降序
                              
                              
    練習(xí): 根據(jù)年齡升序&降序
    db.c1.find({}).sort({age: 1})   升序
    db.c1.find({}).sort({age: -1})  降序
    

分頁

  • Limit與Skip方法

    db.集合名.find().sort().limit(數(shù)字).skip(數(shù)字)
    
    說明: limit() 限制查詢數(shù)據(jù)的條數(shù)
        skip()  跳過指定的數(shù)量
        
    練習(xí):降序查詢查詢2條 
          db.c1.find().sort({age: -1}).limit(2)
          
       降序跳過2條并查詢2條
       
          dn.c1.find().sort({age: -1}).skip(2)
    
  • 實(shí)戰(zhàn)分頁

    需求:數(shù)據(jù)庫1-10數(shù)據(jù),每頁顯示2條數(shù)據(jù)(5頁)

    語法:

    db.find().skip(m).limit(n)
    
    m: (當(dāng)前頁 - 1) * n
    n: 每頁顯示條數(shù)
    

統(tǒng)計(jì)總數(shù)量

  • 語法: count()

    db.集合名.find().count()
    

MongoDB聚合查詢

概念

  • 把數(shù)據(jù)聚起來然后查詢 可以對(duì)集合中的文檔進(jìn)行變換和組合

語法

db.集合名字.aggregate([
    {
        管道:{表達(dá)式}
    },
    ....
])
  • 常用管道
$group   將集合中的文檔進(jìn)行分組通危,用于統(tǒng)計(jì)數(shù)據(jù)
$match   用于過濾數(shù)據(jù),只輸出符合條件的數(shù)據(jù)
$sort    聚合數(shù)據(jù)進(jìn)一步排序     1 升序   -1降序
$skip    跳過指定文檔
$limit   限制集合數(shù)據(jù)返回的文檔數(shù)
$project 增加铸豁、刪除、重命名字段
$lookup  用以引入其他集合的數(shù)據(jù)(表關(guān)聯(lián)查詢)
...
  • 常用表達(dá)式

    $sum: 總和       $sum: 1 相當(dāng)于count  統(tǒng)計(jì)數(shù)量
    $avg: 平均           
    $min: 最小值
    $max: 最大值
    
  • 練習(xí)

    • 統(tǒng)計(jì)男生菊碟、女生的總年齡

      db.c1.aggregate([
          {
              $group: {
                  _id: "$sex",
                  res: {
                      $sum: "$age"
                  }
              }
          }
      ])
      
  • 統(tǒng)計(jì)男生女生的總?cè)藬?shù)

    db.c1.aggregate([
        {
            $group: {
                _id: "$sex",
                count: {$sum: 1}
            }
        }
    ])
    
  • 求學(xué)生總數(shù)和平均年齡

    db.c1.aggregate([
        {
            $group: {
                _id: null,
                count: {$sum: 1},
                avg: {$avg: "$age"}
            }
        }
    ])
    
  • 查詢男生节芥、女生人數(shù), 按人數(shù)升序

    db.c1.aggregate([
        {
            $group: {
                _id: "$sex",
                count: {$sum: 1}
            }
        },
        {
            $sort: {
                count: 1
            }
        }
    ])
    
  • $lookup 集合(表)關(guān)聯(lián)

    db.order.aggregate([               //order集合與order_item集合關(guān)聯(lián)
        {
            $lookup: {
                from: "order_item",     // 關(guān)聯(lián)副表
                localField: "order_id", // 主表的關(guān)聯(lián)字段
                foreignField: "order_id", // 副表的關(guān)聯(lián)字段
                as: "items"     // 關(guān)聯(lián)后的數(shù)據(jù)顯示的字段
            }
        }
    ])
    

MongoDB索引

索引概念

  • 說明: 索引是一種排序好的便于快速查詢的數(shù)據(jù)結(jié)構(gòu)
  • 作用:幫助數(shù)據(jù)庫高效的查詢數(shù)據(jù)

索引優(yōu)缺點(diǎn)

  • 優(yōu)點(diǎn):

    提高數(shù)據(jù)查詢的效率, 降低數(shù)據(jù)庫IO成本

  • 缺點(diǎn):

    占用磁盤空間逆害,

    大量的索引影響SQL語句效率头镊,因?yàn)槊看尾迦牒托薷臄?shù)據(jù)都會(huì)更新索引

語法

  • 創(chuàng)建索引語法

    db.集合名.createIndex(待創(chuàng)建索引的列[,額外選項(xiàng)])
    
  • 參數(shù):

    待創(chuàng)建的索引:{ 鍵:1, ....., 鍵:-1 }

    說明: 1 升序  -1降序  例如{ age: 1 } 表示創(chuàng)建age索引并升序  的方式存儲(chǔ)
    

    額外選項(xiàng): 設(shè)置索引的名稱或者唯一索引等等

  • 刪除索引語法

    全部刪除:db.集合名.dropIndexes()

    刪除指定:db.集合名.dropIndex(索引名)

  • 查看索引語法

    db.集合名.getIndexes()

  • 創(chuàng)建組合索引

    db.c1.createIndex({鍵: 方式,鍵: 方式})

  • 創(chuàng)建唯一索引

    db.集合名.createIndex(待添加索引的列, {unique: l列名})

練習(xí)

  • 給name列添加普通索引

    db.c1.createIndex({name: 1})
    
  • 刪除name索引

    db.c1.dropIndex("name")
    
  • 給name列添加索引并且命名為yuweiqi

    db.c1.createIndex({name: 1}, {name: "yuweiqi"})
    
  • 創(chuàng)建組合索引 同時(shí)給兩個(gè)字段加索引

    db.c1.createIndex({name: 1, age: 1})
    
  • 給name列添加唯一索引

    db.c1.createIndex({name: 1}, {unique: name})
    

分析索引(explain)

  • 語法:

    db.c1.find().explain('executionStats')
    
    

選擇原則(如何選擇合適的列做索引)

  • 為常做條件魄幕、排序相艇、分組、聯(lián)合操作的字段建立索引
  • 選擇唯一性索引 (同值較少如性別字段)
  • 選擇較小的數(shù)據(jù)列纯陨, 為較長(zhǎng)的字符串使用前綴索引

MongoDB權(quán)限機(jī)制

需求

我們?cè)贒OS窗口直接輸入命令就可以登錄數(shù)據(jù)庫

這個(gè)在實(shí)戰(zhàn)中是不允許的

所以使用權(quán)限機(jī)制坛芽,開啟驗(yàn)證模式即可

語法

  • 創(chuàng)建賬號(hào)

    db.createUser({
      "user": 賬號(hào),
      "pwd": 密碼,
      roles: [{
          role: 角色,
          db: 所屬數(shù)據(jù)庫
      }]
    })
    
  • 角色

    #角色種類
    超級(jí)用戶角色: root
    數(shù)據(jù)庫用戶角色: read  readWrite
    數(shù)據(jù)庫管理角色: dbAdmin userAdmin
    ......
    

開啟驗(yàn)證模式

概念: 用戶需要輸入賬號(hào)密碼才能登錄使用

  • 操作步驟

    1.添加超級(jí)管理員
    2.退出卸載服務(wù)
    3.重新安裝需要輸入賬號(hào)密碼的服務(wù)(注意在原安裝命令基礎(chǔ)上加上--auth即可)
    4.啟動(dòng)服務(wù)
    
  • 第一步:添加超級(jí)管理員

    # mongo登錄進(jìn)數(shù)據(jù)庫
    mongo
    
    # 選擇admin數(shù)據(jù)庫
    use admin
    
    # 添加角色
    db.createUser({
      "user":"賬號(hào)"留储,
      “pwd”: "密碼",
      roles: [{
          role: "角色"咙轩,
          db: "所屬數(shù)據(jù)庫"
      }]
    })
    

    注意: 前面版本的數(shù)據(jù)庫是看不到admin數(shù)據(jù)庫的 直接選中就可以了

  • 第二步:退出卸載服務(wù)

    bin/mongod --remove
    

    DOS窗口必須用管理員身份運(yùn)行

  • 第三步: 安裝驗(yàn)證模式的mongodb

    #在mongo的bin目錄下(或者配置環(huán)境變量)
    mongod --install --dbpath D:\MongoDB\Server\4.4\data --logpath D:\MongoDB\Server\4.4\log\mongod2.log(注意日志名字不能和之前安裝的重復(fù)) --auth
    

    測(cè)試安裝成功: 1获讳、mongo登錄沒有warning警告

                            2、show adtabases 默認(rèn)看不到數(shù)據(jù)庫了
    

通過超級(jí)管理員賬號(hào)登錄

  • 語法:

    # 第一種
    mongo 服務(wù)器ip地址:端口(27017)/數(shù)據(jù)庫名 -u 用戶名 -p 密碼
    
    #第二種
    先登錄 -》 再選擇數(shù)據(jù)庫 -》 輸入 db.auth(用戶名,密碼)
    

MongoDB備份還原

備份數(shù)據(jù)庫

  • 語法

    導(dǎo)出數(shù)據(jù)語法: mongodump -h -port -u -p -d -o
    說明: -h       host 服務(wù)器IP地址(一般不寫活喊,默認(rèn)本機(jī))
        -port         端口(默認(rèn)27017 一般不寫)
        -u       user  賬號(hào)
        -p       pwd   密碼
        -d       database  數(shù)據(jù)庫(數(shù)據(jù)庫不寫則導(dǎo)出全局)
        -o       open    備份到指定目錄
    

還原數(shù)據(jù)庫

  • 語法:

    還原數(shù)據(jù)庫語法: mongorestore -h -port -u -p -d --drop 備份數(shù)據(jù)目錄
    
    --drop  先刪除數(shù)據(jù)  再導(dǎo)入  不寫則覆蓋
    

nodejs操作數(shù)據(jù)庫

mongoose模塊

  1. 安裝mongoose模塊
npm install mongoose    // 安裝mongoose模塊

net start mongodb  //開啟數(shù)據(jù)庫
net stop mongodb    //關(guān)閉數(shù)據(jù)庫


  1. node連接mongoodb

    mongoose.connect("mongodb://localhost/playground").then(res => {
        console.log("數(shù)據(jù)庫連接成功")
    })
    .catch(err => {
        console.log(err)
    })
    

創(chuàng)建集合

  • 創(chuàng)建集合的步驟

      1. 對(duì)集合設(shè)定規(guī)則

        const courseSchema = new mongoose.Schema({
            name: String,
            author: String,
            isPublish: boolean
        })
        
      2. 創(chuàng)建集合

        const Course = mongoose.model('Course', courseSchema);
        

創(chuàng)建文檔

  • 創(chuàng)建文檔的兩種方法

    • 第一種方法

      const course = new Course({
         name: "nodejs",
         author: "張三",
         isPUblish: false
      })
      
      course.save()
      
    • 第二種方法

      Course.create({    
          name: "nodejs",
          author: "張三"丐膝,
          isPublish: true
      }, (err, doc) => {
          if(err === null) {
              console.log(doc)
          }
      })
      
      //Course.create()返回的是Promise對(duì)象
      // promise寫法
      Course.create({
          name: "nodejs",
          author: "張三",
          isPublish: false
      }).then(res => {
          console.log(res)
      })
      .catch(err => { 
          console.log(err)
      })
      

數(shù)據(jù)導(dǎo)入導(dǎo)出數(shù)據(jù)庫

  • 準(zhǔn)備工作

    1. 在mongodb安裝路徑中找到mongoimport.exe/ mongoexport.exe可執(zhí)行文件
    2. 將路徑添加到系統(tǒng)path環(huán)境變量中
  • 使用

    # 導(dǎo)入json數(shù)據(jù)
    mongoimport -h IP(默認(rèn)本機(jī))--port 端口(默認(rèn)27017) -u 用戶名 -p 密碼  -d xxxxx -c xxxx --file xxxxx
    // -d 數(shù)據(jù)庫名
    // -c 導(dǎo)入集合名
    // --file 導(dǎo)入文件的位置
    
    # 導(dǎo)出數(shù)據(jù)
    mongoexport -h IP(默認(rèn)本機(jī)) --port 端口(默認(rèn)27017) -u 用戶名 -p 密碼 -d xxxx   -c xxxx  -o 導(dǎo)出的文件名 
    

查詢文檔

根據(jù)條件查詢文檔

  • 指定字段值查詢
Course.find().then(res => {
    console.log(res)
})
// Course 文檔名稱
//返回Course集合中所有的文檔(返回格式為數(shù)組的形式)


Course.find({_id: '123456'}).then(res => {
    console.log(res)
})
//返回Course集合中符合條件的文檔  例:返回_id為'123456'的文檔


Course.findOne().then(res => {
    console.log(res)
})

//返回一個(gè)文檔   若條件為空則返回Course集合中第一個(gè)文檔
  • 指定字段名查詢

    Course.find("name email -_id").then(res => {
        console.log(res)
    })
    
    // 查詢字段名為name、email和字段名不為_id的文檔   查詢多個(gè)字段名則中間用空格隔開,不想要的字段前面加-  如: -_id 字段名不為_id  
    
  • gt 大于lt 小于

    User.find({age: {$gt: 20, $lt: 50}}).then(res => {
        console.log(res)
    })
    // 查詢User文檔中age字段大于20 小于50的文檔
    
  • $in

    User.find({hobbies: {$in: "敲代碼"}}).then(res => {
        console.log(res)
    })
    // 查詢User文檔中hobbies字段
    

查詢文檔排序

Course.find().sort('age').then(res => {
    console.log(res)
})

//查詢文檔同時(shí)根據(jù)age字段升序排列
//    -age   降序排列

限制個(gè)數(shù)查詢

Course.find().skip(2).limit(5).then(res => {
    console.log(res)
})

// 跳過兩個(gè)數(shù)據(jù)并且限制只能查詢5條數(shù)據(jù)

刪除文檔

  • 刪除單個(gè)文檔

    User.findOneAndDelete({id: "123456"}).then(res => {
        console.log(res)
    })
    // 刪除字段id值為'123456'的文檔,如果有多個(gè)也只會(huì)刪除匹配的第一個(gè)
    
  • 刪除多個(gè)文檔

    User.deleteMany({}).then(res => {
        console.log(res)
    })
    
    //  刪除User集合中的所有文檔   返回{ n: 5, ok: 1 } 表示刪除5個(gè)文檔  刪除成功
    

更新文檔

  • 更新單個(gè)文檔

    User.updateOne({name: "張三"}, {name: "李狗蛋"}).then(res => {
        console.log(res)
    })
    // 更新User集合中name字段’張三‘改為'李狗蛋'(只更新一個(gè))
    
  • 更新多個(gè)文檔

    User.updateMany({name: "張三"}胧弛, {name: "李狗蛋"}).then(res => {
        console.log(res)
    })
    
    // 更新User集合中name字段“張三”改為”李狗蛋“(更新所有的)
    

mongoose驗(yàn)證

在創(chuàng)建集合規(guī)則時(shí)尤误, 設(shè)置當(dāng)前字段的驗(yàn)證規(guī)則,驗(yàn)證失敗則插入失敗

require: true  //必傳字段

require: [true, '插入失敗時(shí)顯示']

示例

const postSchema = new mongoose.Schema({
    name: {                    // name為必傳字段
        type: String,
        require: true
    }
})
  • 針對(duì)字符串的驗(yàn)證

    • maxlength: xxx 傳入字段的最大長(zhǎng)度 maxlength: [xx, xxxxxxx] xxxxxxx為驗(yàn)證失敗時(shí)提示

    • minlength:xxx 傳入字段的最小長(zhǎng)度 minlength:[xx, xxxxxxxx] xxxxxxx為驗(yàn)證失敗時(shí)提示

    • trim: true/false 是否允許字符串前后有空格

  • 針對(duì)Number型

    • max:xxxx 最大值
    • min: xxxx 最小值
  • 默認(rèn)值

    • default: xxxxx

      publishDate: {
          type: Date,
          default: Date.now        //  publishDate字段類型為Date類型结缚,不傳值則默認(rèn)為當(dāng)前時(shí)間
      }
      
  • enum

    • enum: xxxxx

      category: {
          type: String,
          enum: ['html', 'css', 'java']
      }
      
      // category 只能為html 或 css  或 java
      
  • 自定義驗(yàn)證
validate: {
    validate: v => {
        return v && v.length > 4   //條件:長(zhǎng)度大于4 
    },
    message: "xxxxxxxxx"           //失敗時(shí)的錯(cuò)誤信息
}

集合關(guān)聯(lián)

  • 使用id進(jìn)行關(guān)聯(lián)

  • 使用populate方法進(jìn)行關(guān)聯(lián)集合查詢

// User集合
const User = mongose.model("User", new mongoose.Schema({
    name: {
        type: String
    }
}))


// Post集合(關(guān)聯(lián)User集合)
const Post = mongoose.model("Post", new mongoose.Schema({
    title: {
        type: String
    },
    author: {
        type: mongoose.Schema.Types.ObjectId,  //固定寫法
        ref: "User"
    }
}))

//User集合中創(chuàng)建一個(gè)文檔
User.create({
    name: "張三"
}).then(res => {
    console.log(res)
})

// Post集合中創(chuàng)建一個(gè)文檔

Post.create({
    title: '123',
    author: 'xxxxxxxxxxx'     // xxxxxxx為User集合中具體的關(guān)聯(lián)文檔的_id字段
})


// 查詢post集合

Post.find().populate('author').then(res => {
    console.log(res)
})



接口開發(fā)規(guī)范(Restful API)

明確需求

  • 說明: RESTful 是目前最流行的一種互聯(lián)網(wǎng)軟件架構(gòu)(思想)

  • 作用: 聲明/提供可接口設(shè)計(jì)原則和約束條件(一個(gè)規(guī)范)

  • 相關(guān):

    get 查看 post 添加 put 修改 delete 刪除

  • 好處: 統(tǒng)一開發(fā)規(guī)范损晤, 便于團(tuán)隊(duì)協(xié)作開發(fā)

標(biāo)準(zhǔn)的RESTful架構(gòu)需要做到

訂單模塊
/order      get
/order      post
/order/編號(hào)  put
/order/編號(hào)  delete
  • 項(xiàng)目所有模塊有統(tǒng)一的標(biāo)準(zhǔn)
  • 看URL就知道要操作的資源是什么(也就是哪個(gè)模塊)
  • 看Http Method就知道操作動(dòng)作是什么,如post(添加) delete(刪除)
  • 看Http Status Code 就知道操作結(jié)果如何红竭, 成功(200)內(nèi)部錯(cuò)誤(500)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末尤勋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子茵宪,更是在濱河造成了極大的恐慌最冰,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稀火,死亡現(xiàn)場(chǎng)離奇詭異暖哨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)凰狞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門篇裁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赡若,你說我怎么就攤上這事达布。” “怎么了逾冬?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵黍聂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我身腻,道長(zhǎng)产还,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任嘀趟,我火速辦了婚禮雕沉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘去件。我一直安慰自己坡椒,他們只是感情好扰路,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著倔叼,像睡著了一般汗唱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上丈攒,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天哩罪,我揣著相機(jī)與錄音,去河邊找鬼巡验。 笑死际插,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的显设。 我是一名探鬼主播框弛,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼捕捂!你這毒婦竟也來了瑟枫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤指攒,失蹤者是張志新(化名)和其女友劉穎慷妙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體允悦,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡膝擂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了隙弛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片架馋。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖驶鹉,靈堂內(nèi)的尸體忽然破棺而出绩蜻,到底是詐尸還是另有隱情铣墨,我是刑警寧澤室埋,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站伊约,受9級(jí)特大地震影響姚淆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜屡律,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一腌逢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧超埋,春花似錦搏讶、人聲如沸佳鳖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽系吩。三九已至,卻和暖如春妒蔚,著一層夾襖步出監(jiān)牢的瞬間穿挨,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工肴盏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留科盛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓菜皂,卻偏偏與公主長(zhǎng)得像贞绵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子幌墓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • MongoDB是什么 MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫但壮。有C++語言編寫,旨在為WEB應(yīng)用提供可擴(kuò)展...
    魔炫Max閱讀 297評(píng)論 0 1
  • 首先附上Python的官方中文文檔常侣。在刷微信中看到了一個(gè)百天打卡學(xué)習(xí)Python的項(xiàng)目蜡饵,就參加了,下面是筆記胳施。 5...
    CrazySteven閱讀 1,351評(píng)論 0 1
  • 一.范式化與反范式化范式的優(yōu)點(diǎn):1)范式化的數(shù)據(jù)庫更新起來更加快溯祸;2)范式化之后,只有很少的重復(fù)數(shù)據(jù)舞肆,只需要修改更...
    微子Lee閱讀 1,187評(píng)論 0 2
  • 關(guān)系數(shù)據(jù)庫入門 關(guān)系數(shù)據(jù)庫概述 數(shù)據(jù)持久化 - 將數(shù)據(jù)保存到能夠長(zhǎng)久保存數(shù)據(jù)的存儲(chǔ)介質(zhì)中焦辅,在掉電的情況下數(shù)據(jù)也不會(huì)...
    d4d98020ef88閱讀 654評(píng)論 0 0
  • 什么是MongoDB MongoDB是一個(gè)文檔數(shù)據(jù)庫,提供好的性能椿胯,領(lǐng)先的非關(guān)系型數(shù)據(jù)庫筷登。采用BSON存儲(chǔ)文檔數(shù)據(jù)...
    張三的生活閱讀 619評(píng)論 0 7