nodejs操作數據庫知識點

2020-08-09 12:26:15

數據庫操作

MySQL

mySQL的安裝設定

請自行查詢相關資料

在Nodejs中使用mySQL

  • 安裝mysql模組
    npm install mysql
  • 連線數據庫

    • 使用連線物件方式
        var mysql = require('mysql');
    
        //建立連線物件,並設定參數
        var connection = mysql.createConnection({
            host     : 'localhost',
            user     : 'root',
            password : 'nfq123456',
            database : 'udata'
        });
        
        // 連線數據庫
        connection.connect();
        
        // 查詢數據庫
        connection.query('select * from user', function (error, results, fields) {
            if (error) throw error;
            console.log('The solution is: ', results);
        });
        
        // 關閉連線,釋放資源
        connection.end();
    
    • 使用連線池方式(官方是推薦)

    使用連線池,預設會在連線池中建立10個連線物件(connectionLimit),使用完成自動放回連線池,不需要手動關閉

        var mysql = require('mysql');
    
        //建立連線池
        var pool  = mysql.createPool({
            host     : 'localhost',
            user     : 'root',
            password : 'nfq123456',
            database: 'udata',
            multipleStatements: true
        });
    
    pool.query('select * from user', function(error, rows){
            console.log(rows);
        });
    
  • 封裝模組

        // 設定參數
        // ...
        module.exports = {
            query: sql=>{
                return new Promise((resolve,reject)=>{
                    pool.query(sql, function(err, rows){
                        if(err) return reject(err);
                        resolve(rows);
                    });
                })
            }
        }
    
  • 數據庫操作:

    query(sql,callback)

    • insert into <表名> [(<欄位名1>[,..<欄位名n > ])] values ( 值1 )[, (值n )];
        insert into MyGuests (firstname, lastname, email) values ('John', 'Doe', '[email protected]');
    
    • delete from <表名> where <條件>
        --刪除MyGuests表中id爲1的數據
        DELETE FROM MyGuests where id=1;
    
        --刪除所有數據
        DELETE FROM MyGuests
    
    • update <表名> set 欄位=新值,… where 條件
        update MyGuests set name='Mary' where id=1;
    
    • select <欄位1, 欄位2, ...> from <表名> where <表達式>
        --檢視錶 MyGuests 中所有數據
        select * from MyGuests;
    
        --檢視錶 MyGuests 中前10行數據:
        select * from MyGuests order by id limit 0,10;
    
  • 條件控制語句: WHERE

    SELECT * FROM tb_name WHERE id=3;

    • 相關條件控制符:
      • =、>、<、<>、IN(1,2,3…)、BETWEEN a AND b
      • AND、OR、NOT
      • LIKE用法中
        • % 匹配任意、
        • _ 匹配一個字元(可以是漢字)
    • LIMIT idx,qty:數量控制
      • SELECT * FROM goods LIMIT 2,5
    • IS NULL 空值檢測
    • 排序ORDER BY
      • asc 升序(預設)
      • desc 降序

MongoDB

MongoDB是一個基於分佈式檔案儲存的數據庫,由C++語言編寫,旨在爲WEB應用提供可延伸的高效能數據儲存解決方案,是一個介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富,最像關係數據庫的。它支援的數據結構非常鬆散,是類似json的bson格式

bson:是一種類json的一種二進制形式的儲存格式,簡稱Binary JSON

下載與安裝

  • 下載地址:https://www.mongodb.com/download-center/community
  • 安裝路徑儘量簡單,不要有中文

設定數據庫(V3.6如果不是請忽略這部分設定)

  • 設定環境變數

安裝mongodb預設自動設定環境變數,方便在命令列中使用相關命令

  • 設定數據庫儲存目錄
    mongod.exe --dbpath D:\data\mongodb\db

啓動成功後,可通過 http://127.0.0.1:27017 存取,但關閉後每次存取都必須重複以上操作

  • 設定爲 windows 服務,實現開機自動啓動Mongodb

    1. 建立mongod.cfg檔案,並寫入以下內容
        systemLog:
            destination: file
            path: d:\data\mongodb\log\mongod.log
        storage:
            dbPath: d:\data\mongodb\db
    
    1. 執行以下命令,安裝windows服務
        mongod.exe --config c:\mongodb\mongod.cfg --service --serviceName MongoDB --install
    

PS: MongoDB4.0後預設安裝windows服務

命令列操作

連線數據庫

  • mongo 連線到數據庫並進行操作
  • mongod 顯示數據庫資訊

常用命令(命令列)

輸入help可以看到基本操作命令

數據庫操作(Database)
  • 檢視所有數據庫: show dbs
  • 建立/切換數據庫: use DBNAME

如果數據庫不存在,則建立數據庫,否則切換數據庫。

  • 檢視當前使用的數據庫: db
  • 顯示當前db狀態: db.stats()
  • 檢視當前db的鏈接地址: db.getMongo()
  • 刪除當前使用數據庫: db.dropDatabase()
集合操作(Collection)

利用use DBNAME 切換到當前數據庫後,可以進行集合與文件的操作

  • 建立集合:

    • db.createCollection(NAME);

    PS:只有建立了集合,數據庫才能 纔能真正成功建立

  • 查詢所有集合:

    • show collections
  • 刪除集合:

    • db.NAME.drop();
文件操作(Document)

文件就是數據,這裏的所有操作都是針對數據,格式:db.NAME.方法()

  • 增(插入數據):
    • insertOne(document)
    • insertMany([document,…])
    db.user.insertOne({username:'fqniu'});
    db.user.insertMany([{"username": 'fqniu'}, {'username': '小牛牛'}]);

當你插入一些文件時,MongoDB 會自動建立集合NAME

  • 刪(刪除數據)
    • deleteOne(query)
    • deleteMany(query)
  • 改(更新數據)
    • updateOne(query,newData)
    • updateMany(query,newData)
    • save(document)
    //更新指定欄位
    //查詢name屬性爲fqniu的數據,並更新age屬性爲25
    db.user.updateOne({name:'fqniu'},{$set:{age:25}})

    // 找到所有年齡大於18的數據,並設定description爲成年
    db.user.updateMany( { age: { $gt : 18 } } , { $set : { description : "成年"} } );
  • 查(查詢數據):

    • 查詢所有:db.NAME.find()
    • 按條件查詢(支援多條件):db.NAME.find(query)
    • 查詢第一條(只獲取第一條):db.NAME.findOne(query)

    find()方法一般後一般使用toArray()方法把結果轉成陣列

        //查詢user下所有數據
        db.user.find().toArray((err,result)=>{});
        
        // 查詢user下年齡爲38的
        db.user.find({age:38}).toArray()
    
        // 查詢user下年齡大於38的
        db.user.find({age:{$gt:38}}).toArray()
    
        //利用pretty()方法格式化結果
        db.user.find().toArray().pretty();
    

查詢條件

  • 比較查詢
    • 大於:$gt
    • 小於:$lt
    • 大於等於:$gte
    • 小於等於:$lte
    • 非等於:$ne
  • 包含/不包含:$in/$nin
    db.goods.find({id:{$in:[10,18,26,13]}})
  • 或:$or
    db.user.find({$or:[{name:'fqniu'},{name:'牛牛'}]})
    db.user.find({$or:[{age:{$gt:18}},{description:"成年"}]})
  • 匹配所有:$all
  • 判斷文件屬性是否存在:$exists
    db.user.find({password:{$exists:true}})   //查詢屬性password存在的使用者
    db.user.find({password:{$exists:false}})  //查詢屬性password不存在的數據
    db.user.find({age:{$in:[null],$exists:true}}) //查詢age屬性存在但值爲null的數據
  • 正則表達式
    db.user.find({"name":/jack/i});//查詢name屬性包含jack的數據(不區分大小寫)

篩選

  • 限制數量:db.表名.find().limit(數量);
  • 跳過指定數量:db.表名.find().skip(數量)
  • 排序:sort({key:1})
    • 1 : 升序
    • -1 : 降序

三個放在一起使用的時候,執行的順序是先 sort(), 然後是 skip(),最後是 limit()

    // 把型別爲字String的價格按數位排序
    db.goods.find().collation({numericOrdering:true}).sort({price:1})

    // 根據某個值修改文件中的另一個值(把price的值改成sale_price的8折)
    db.goods.find({price:0}).forEach(item=>{                
        db.goods.updateOne({_id:item._id},{$set:{price: item.sale_price*0.8}})
    })

NodeJS中使用mongodb

安裝mongodb模組

    npm install mongodb --save

數據庫操作

  • 連線mongoDB
    const mongodb = require('mongodb');
    const MongoClient = mongodb.MongoClient;

    //連線mongoDB
    MongoClient.connect("mongodb://localhost:27017", function(err, client) {
      if(err) throw err;
        // 連線數據庫,無則自動建立
        let db = client.db('userlist');
    });

集合操作

  • 建立集合:createCollection()

格式:db.createCollection(name, options)

  • 使用集合collection()

db.collection(name)

  • 刪除集合:drop()

格式:db.COLLECTION_NAME.drop(callback)

    db.createCollection('site', function (err, res) {
        if (err) throw err;
        console.log("建立集合!");
        db.close();
    });

文件操作

同上命令列操作 <文件操作(Document)>

MongoDB的匯入導出

  • 導出mongoexport
    把一個collection導出成JSON格式或CSV格式的檔案。可以通過參數指定導出的數據項,也可以根據指定的條件導出數據

    • 格式:mongoexport -d dbname -c collectionname -o file --type json/csv -f field
    • 參數說明:
      • -d :數據庫名
      • -c :collection名
      • -o :輸出的檔名
      • –type : 輸出的格式,預設爲json
      • -f :輸出的欄位,如果-type爲csv,則需要加上-f 「欄位名」
    mongoexport -d mytest -c goods -o D:/data/goods.json --type json -f  "_id,name,price,img_url,add_time"
  • 匯入mongoimport
    • 格式:mongoimport -d dbname -c collectionname --file filename --headerline --type json/csv -f field
    • 參數說明:
      • -d :數據庫名
      • -c :collection名
      • –type :匯入的格式預設json
      • -f :匯入的欄位名
      • –headerline :如果匯入的格式是csv,則可以使用第一行的標題作爲匯入的欄位
      • –file :要匯入的檔案
     mongoimport -d mongotest -c goods --file D:/data/goods.json --type json

MongoDB備份與恢復

  • 備份

    • 格式:mongodump -h dbhost -d dbname -o dbdirectory

    • 參數說明:

      • -h: MongDB所在伺服器地址,例如:127.0.0.1,當然也可以指定埠號:127.0.0.1:27017
      • -d: 需要備份的數據庫範例,例如:test
      • -o: 備份的數據存放位置,例如:D:/mongodump/

      當然該目錄需要提前建立,這個目錄裏面存放該數據庫範例的備份數據。

        mongodump -h 127.0.0.1:27017 -d mytest -o D:/mongodump/
    
  • 恢復

    • 格式:mongorestore -h dbhost -d dbname --dir dbdirectory

    • 參數或名:

      • -h: MongoDB所在伺服器地址
      • -d: 需要恢復的數據庫範例,例如:test,當然這個名稱也可以和備份時候的不一樣,比如test2
      • –dir: 備份數據所在位置,例如:D:/mongodump/
      • –drop: 恢復的時候,先刪除當前數據,然後恢復備份的數據。就是說,恢復後,備份後新增修改的數據都會被刪除,慎用!
        mongorestore -h 192.168.17.129:27017 -d mytest --dir D:/mongodump/
    

    【實現需求】

    • 封裝數據的增刪改查
    • 登錄/註冊頁面的實現
      • 利用token保持登錄狀態