Node學習筆記 Mongodb 和 Mongoose

SFatpaper發表於2020-11-30

關係型資料庫 和 非關係型資料庫

  • 關係型資料庫

    • 最典型的資料結構是表
    • 關係型資料庫是由二維表及其之間的聯絡所組成的一個資料組織
    • 都需要使用 SQL 語言操作
    • ……
  • 非關係型資料庫

    • 嚴格上不是一種資料庫,沒有 的概念,是一種資料結構化儲存方法的集合
    • 資料結構由鍵值 (key => value) 對組成,類似於 JSON 物件
    • 在非關係型資料庫中,集合 相當於 文件物件 相當於 表記錄
    • ……

MongoDB

介紹

MongoDB 是一個介於關聯式資料庫和非關聯式資料庫之間的產品,是非關聯式資料庫當中功能最豐富,最像關聯式資料庫的。

安裝

安裝檔案下載地址:[https://www.mongodb.com/download-center/community]

Windows 平臺安裝 MongoDB:https://www.runoob.com/mongodb/mongodb-window-install.html

在安裝過程中需要特別注意,需要將 Install MongoDB Compass 前預設的勾選取消

可以使用 mongod --version 命令檢視 MongoDB 版本,若版本號輸出正常則安裝完畢

啟動資料庫(三種方式)

  • cmd + cd到安裝路徑

    // cmd命令列cd到安裝路徑
    cd C:\Program Files\MongoDB\Server\3.4\bin
    
    // 然後cmd啟動MongoDB,執行cmd命令
    mongod.exe --dbpath E:\db\MongoDB
    
  • 按照如下順序,新增全域性變數

    桌面 > 我的電腦 > 滑鼠右鍵選擇 > 屬性 > 高階系統屬性 > 環境變數 > 全域性變數 > 選擇編輯 Path,將 MongoDB 的安裝目錄新增到列表,如 C:\Program Files\MongoDB\Server\3.4\bin
    
    然後,開啟 cmd 執行命令: mongod
    
    最後,cmd 執行命令: mongod --dbpath E:\db\MongoDB // 修改資料庫位置
    

    預設情況下,通過命令啟動的資料庫目錄在 命令執行所在碟符根目錄 /data/db 檔案

    伺服器和操作伺服器是兩個程式,可以修改預設資料庫路徑

    mongod --dbpath '資料庫自擬路徑'
    
  • 自定義 .bat 批處理檔案

    在修改了全域性變數 path 的變數路徑之後,在本地新建一個文字文件,修改檔案字尾名為 .bat(.bat檔案命名:不能有空格出現,儘量英文,可使用下劃線間隔)
    
    開啟該.bat批處理檔案,新增如下程式碼,並儲存檔案
    echo "MongoDB starting.........."
    mongod --dbpath E:\db\MongoDB
    pause
    
    滑鼠雙擊該批處理檔案,正常情況下,就會快速啟動 MongoDB 資料庫服務
    

關閉資料庫

mongod  --shutdown

使用預設埠來連線 MongoDB 服務

mongo

資料庫操作

  • 顯示所有已存在的資料庫

    show dbs
    

    在顯示的結果中 adminlocal 兩個結果為系統資料庫

  • 刪除資料庫

    db.dropDatabase()
    

    刪除當前資料庫,預設為 test,你可以使用 db 命令檢視當前資料庫名

    以下例項我們刪除了資料庫 runoob

    > show dbs
    admin   0.000GB
    config  0.000GB
    local   0.000GB
    runoob  0.000GB
    

    接下來我們切換到資料庫 runoob

    > use runoob
    switched to db runoob
    

    執行刪除命令

    > db.dropDatabase()
    { "dropped" : "runoob", "ok" : 1 }
    
  • 切換到目標資料庫

    use demo
    

    通過命令 use + 目標資料庫名 ,既可切換到目標資料庫

  • 檢視當前運算元據庫

    db
    

    通過 db 命令可以檢視當前操作的資料庫

    這裡需要注意的是,當資料庫中沒有資料時,資料庫不予顯示

  • 顯示當前資料庫的所有集合

    show collections
    

    檢視當前 db 資料庫中存在的所有集合

    這裡需要注意的是,當集合中沒有資料時,合集不予顯示

  • 顯示當前集合中所有資料

    db.students.find()
    

    通過 db. + 當前集合名稱 + .find() 可以檢視當前集合中的所有資料

  • 向當前集合新增資料

    db.students.insertOne({name: 'demo'})
    

    通過 db. + 當前集合名稱 + .insertOne({ + 資料物件 + }) 可以向當前集合中新增資料

  • 斷開 MongoDB 服務

    exit
    
  • 斷開資料庫連結

    db.shutdownServer()
    

MongoDB 備份與恢復

  • 備份(mongodump)

    在Mongodb中我們使用mongodump命令來備份MongoDB資料。該命令可以匯出所有資料到指定目錄中

    mongodump命令指令碼語法如下:

    mongodump -h dbhost -d dbname -o dbdirectory
    // -h:MongDB所在伺服器地址,例如:127.0.0.1,當然也可以指定埠號:127.0.0.1:27017
    // -d:需要備份的資料庫例項,例如:test
    // -o:備份的資料存放位置,例如:c:\data\dump,當然該目錄需要提前建立,在備份完成後,系統自動在dump目錄下建立一個test目錄,這個目錄裡面存放該資料庫例項的備份資料
    
  • 恢復(mongorestore)

    mongodb使用 mongorestore 命令來恢復備份的資料

    mongorestore命令指令碼語法如下:

    mongorestore -h <hostname><:port> -d dbname <path>
    // --host <:port>, -h <:port>:MongoDB所在伺服器地址,預設為: localhost:27017
    // --db , -d :需要恢復的資料庫例項,例如:test,當然這個名稱也可以和備份時候的不一樣,比如test2
    // --drop:恢復的時候,先刪除當前資料,然後恢復備份的資料。就是說,恢復後,備份後新增修改的資料都會被刪除,慎用哦!
    // <path>:mongorestore 最後的一個引數,設定備份資料所在位置,例如:c:\data\dump\test。你不能同時指定 <path> 和 --dir 選項,--dir也可以設定備份目錄
    // --dir:指定備份的目錄,你不能同時指定 <path> 和 --dir 選項
    

    接下來我們執行以下命令:

    mongorestore
    

Mongoose

介紹

Mongoose 是在 node.js 非同步環境下對 mongodb 進行便捷操作的物件模型工具

安裝

npm install mongoose

使用

var mongoose = require('mongoose'); // 引入 mongoose
mongoose.connect('mongodb://localhost/test'); // 通過 mongoose 連線 mongodb 資料庫

連線資料庫的預設埠為 27017

.connect 中返回一個狀態待定(pending)的連線, 可供我們對連線成功與否進行監測

var db = mongoose.connection; // 資料庫連線狀態
db.on('error', console.error.bind(console, 'connection error:')); // 資料庫連線失敗
db.once('open', function() {
  // we're connected!(資料庫連線成功)
});

.on 的第一個引數可選值為 connectederrordisconnected ,分別用於監測 連線成功、連結異常、連結斷開

建立模型,設計資料庫

var kittySchema = mongoose.Schema({
  name: String,
  // 也可以如下寫法
  name: {
    type: String, // 資料型別
    required: Boolean, // 是否為必須
    defaule: '張三', // 預設值
    enum: ['張三', '李四', '王五', '趙六'] // 列舉,預設值只可是列舉值
  }
}
});
var Kitten = mongoose.model('Kitten', kittySchema);

mongoose.model 用於將一個資料庫模型釋出為 model

以上程式碼中,相當於建立了一個名為 Kitten 的集合,該集合內部的資料結構中有一條資料名為 name ,且是 字串 型別

使用 Kitten 以下程式碼創造一條資料

var felyne = new Kitten({ name: 'Felyne' });

此時,集合 Kitten 中會增加一條 nameFelyne 的資料,Felyne 的資料型別為 String

通過 .save 方法可以驗證資料是否儲存成功

fluffy.save(function (err, fluffy) {
    if (err) return console.error(err);
    fluffy.speak();
});

注意 回撥函式的第一個引數永遠是 error

  • 增加資料

    Model.save([fn])

    var user = new User({
      username: 'kongzhi0707',
      password: '123456'
    });
    user.save(function(err, res) {
      if (err) {
          return console.log(err);
      }  
      console.log(res);
    });
    
  • 刪除資料

    1. 從集合中刪除所有符合條件的文件:Model.remove(conditions, [callback])

      conditions:Object

      [callback]:Function

      示例:

      var wherestr = {'username': 'kongzhi0707'}; // 刪除資料的條件
      User.remove(wherestr, function(err, res) {
        if (err) {
            return console.log(err);
        }  
        console.log(res);
      });
      
    2. 查詢匹配符合 id 的文件,將其刪除:Model.findByIdAndRemove(id, [options], [callback])

      id:Object|Number|String

      [options]:Object

      ​ sort:如果條件找到多個文件,請設定排序順序以選擇要更新的文件

      ​ select:設定要返回的文件欄位

      ​ rawResult:如果為 true ,則返回 MongoDB 驅動程式的原始結果

      ​ strict:覆蓋此更新的架構的嚴格模式選項

      [callback]:Function

      示例:

      User.findByIdAndRemove(id, options, callback) // executes
      User.findByIdAndRemove(id, options)  // return Query
      User.findByIdAndRemove(id, callback) // executes
      User.findByIdAndRemove(id) // returns Query
      User.findByIdAndRemove()           // returns Query
      
    3. 根據記錄 :Model.findOneAndRemove(conditions, [options], [callback])

      conditions:Object

      [options]:Object

      ​ sort:如果條件找到多個文件,請設定排序順序以選擇要更新的文件

      ​ maxTimeMS:對查詢設定時間限制

      ​ select:設定要返回的文件欄位

      ​ rawResult:如果為 true ,則返回 MongoDB 驅動程式的原始結果

      ​ strict:覆蓋此更新的架構的嚴格模式選項

      [callback]:Function

      示例:

      User.findOneAndRemove(conditions, options, callback) // executes
      User.findOneAndRemove(conditions, options)  // return Query
      User.findOneAndRemove(conditions, callback) // executes
      User.findOneAndRemove(conditions) // returns Query
      User.findOneAndRemove()           // returns Query
      
  • 更新資料

    1. 根據條件更新資料庫中的一個文件:Model.update(conditions, doc, [options], [callback])

      conditions:Object

      doc:Object

      [options]:Object

      ​ safe:(布林值)安全模式(預設為在架構(true)中設定的值)

      ​ upsert:(布林值)是否建立不匹配的文件(假)

      ​ multi:(布林值)是否應更新多個文件(假)

      ​ runValidators:如果為 true ,則對此命令執行更新驗證程式。更新驗證器根據模型的架構驗證更新操作

      ​ setDefaultsOnInsert:如果 this 和 upsert 為 true ,則在建立新文件時,貓鼬將應用模型模式中指定的預設值(此選項僅在MongoDB >= 2.4上有效)

      ​ strict:(布林值)會覆蓋此更新的嚴格選項

      ​ overwrite:(布林值)禁用僅更新模式,從而允許您覆蓋文件(false)

      [callback]:Function

      示例:

      var wherestr = {'username': 'kongzhi0707'}; // 更新資料的條件查詢
      var updatestr = {'password': 'abcdef'}; // 執行更新資料
      User.update(wherestr, updatestr, function(err, res) {
        if (err) {
            return console.log(err);
        }  
        console.log(res);
      });
      
    2. 通過文件的 _id 欄位更新資料庫中的一個文件 :Model.findByIdAndUpdate(id, [update], [options], [callback])

      id:Object|Number|String

      [update]:Object

      [options]:Object

      ​ new:bool-true,返回修改後的文件而不是原始文件(預設為 false )

      ​ upsert:bool-建立物件(如果不存在)(預設為false)

      ​ runValidators:如果為true,則對此命令執行更新驗證程式。更新驗證器根據模型的架構驗證更新操作

      ​ setDefaultsOnInsert:如果 this 和 upsert 為 true ,則在建立新文件時,貓鼬將應用模型模式中指定的預設值(此選項僅在MongoDB >= 2.4上有效)

      ​ sort:如果條件找到多個文件,請設定排序順序以選擇要更新的文件

      ​ select:設定要返回的文件欄位

      ​ rawResult:如果為true,則返回MongoDB驅動程式的原始結果

      ​ strict:覆蓋此更新的架構的嚴格模式選項

      [options.lean]:Object

      [callback]:Function

      示例:

      User.findByIdAndUpdate(id, update, options, callback) // executes
      User.findByIdAndUpdate(id, update, options)  // returns Query
      User.findByIdAndUpdate(id, update, callback) // executes
      User.findByIdAndUpdate(id, update)           // returns Query
      User.findByIdAndUpdate()                     // returns Query
      
    3. 根據記錄:Model.findOneAndUpdate([conditions], [update], [options], [callback])

      [conditions]:Object

      [update]:Object

      [options]:Object

      ​ new:bool-如果為true,則返回修改後的文件而不是原始文件(預設為false)

      ​ upsert:bool-建立物件(如果不存在)(預設為false)

      ​ fields:{Object | String} 等效於 .select(fields).findOneAndUpdate()

      ​ maxTimeMS:對查詢設定時間限制-需要 mongodb >= 2.6.0

      ​ sort:如果條件找到多個文件,請設定排序順序以選擇要更新的文件

      ​ runValidators:如果為 true ,則對此命令執行更新驗證程式。更新驗證器根據模型的架構驗證更新操作

      ​ setDefaultsOnInsert:如果 this 和 upsert 為 true ,則在建立新文件時,貓鼬將應用模型模式中指定的預設值(此選項僅適用於MongoDB >= 2.4)

      ​ rawResult:如果為true,則返回MongoDB驅動程式的原始結果

      ​ strict:覆蓋此更新的架構的嚴格模式選項

      [options.lean]:Object

      [callback]:Function

      示例:

      User.findOneAndUpdate(conditions, update, options, callback) // executes
      User.findOneAndUpdate(conditions, update, options)  // returns Query
      User.findOneAndUpdate(conditions, update, callback) // executes
      User.findOneAndUpdate(conditions, update)           // returns Query
      User.findOneAndUpdate()                             // returns Query
      
  • 查詢資料

    1. 根據條件查詢檔案:Model.find(conditions, [fields], [options], [callback]);

      conditions:Object

      [projection]:Object

      [options]:Object

      [callback]:Function

      示例:

      var wherestr = {'userName': '龍恩0707'}; // 刪除資料的條件
      User.find(wherestr, function(err, res) {
      if (err) {
            return console.log(err);
      }  
        console.log(res);
      });
      
    2. 通過其 _id 欄位查詢單個文件:Model.findById(id, [projection], [options], [callback])

      id:Object|String|Number

      [projection]:Object

      [options]:Object

      [callback]:Function

      示例:

      Adventure.findById(id, function (err, adventure) {}); // find adventure by id and execute immediately
        
      Adventure.findById(id).exec(callback); // same as above
      
      Adventure.findById(id, 'name length', function (err, adventure) {}); // select only the adventures name and length
      
      Adventure.findById(id, 'name length').exec(callback); // same as above
      
      Adventure.findById(id, '-length').exec(function (err, adventure) {}); // include all properties except for `length`
      
      Adventure.findById(id, 'name', { lean: true }, function (err, doc) {}); // passing options (in this case return the raw js objects, not mongoose documents by passing `lean`
      
      Adventure.findById(id, 'name').lean().exec(function (err, doc) {}); // same as above
      
    3. 根據記錄:Model.findOne([conditions], [projection], [options], [callback])

      id:Object|String|Number

      [projection]:Object

      [options]:Object

      [callback]:Function

      示例:

      Adventure.findById(id, function (err, adventure) {}); // find adventure by id and execute immediately
      
      Adventure.findById(id).exec(callback); // same as above
      
      Adventure.findById(id, 'name length', function (err, adventure) {}); // select only the adventures name and length
      
      Adventure.findById(id, 'name length').exec(callback); // same as above
      
      Adventure.findById(id, '-length').exec(function (err, adventure) {}); // include all properties except for `length`
      
      Adventure.findById(id, 'name', { lean: true }, function (err, doc) {}); // passing options (in this case return the raw js objects, not mongoose documents by passing `lean`
      
      Adventure.findById(id, 'name').lean().exec(function (err, doc) {}); // same as above
      
    4. 範圍查詢:

      User.find({userage: {gte: 21,lte: 65}}, callback); //這表示查詢年齡大於等21而且小於等於65歲
      

      可用的部分類似範圍查詢條件還有:

      o r ∗ ∗ : 或 關 系 ∗ ∗ or**:或關係 ** ornor:或關係取反 g t ∗ ∗ : 大 於 ∗ ∗ gt**:大於 ** gtgte:大於等於

      l t ∗ ∗ : 小 於 ∗ ∗ lt**: 小於 ** ltlte:小於等於 n e ∗ ∗ : 不 等 於 ∗ ∗ ne**:不等於 ** nein:在多個值範圍內

      n i n ∗ ∗ : 不 在 多 個 值 範 圍 內 ∗ ∗ nin**:不在多個值範圍內 ** ninall:匹配陣列中多個值 $regex:正則,用於模糊查詢

      s i z e ∗ ∗ : 匹 配 數 組 大 小 ∗ ∗ size**:匹配陣列大小 ** sizemaxDistance:範圍查詢,距離(基於LBS)

      m o d ∗ ∗ : 取 模 運 算 ∗ ∗ mod**:取模運算 ** modnear:鄰域查詢,查詢附近的位置(基於LBS)

      e x i s t s ∗ ∗ : 字 段 是 否 存 在 ∗ ∗ exists**:欄位是否存在 ** existselemMatch:匹配內陣列內的元素

      w i t h i n ∗ ∗ : 範 圍 查 詢 ( 基 於 L B S ) ∗ ∗ within**:範圍查詢(基於LBS) ** withinLBSbox:範圍查詢,矩形範圍(基於LBS)

      c e n t e r ∗ ∗ : 範 圍 醒 詢 , 圓 形 範 圍 ( 基 於 L B S ) ∗ ∗ center**:範圍醒詢,圓形範圍(基於LBS) ** centerLBScenterSphere:範圍查詢,球形範圍(基於LBS)

      $slice:查詢欄位集合中的元素(比如從第幾個之後,第N到第M個元素)


資料參考:

相關文章