1. 程式人生 > >Node.js 封裝操作MongoDB庫

Node.js 封裝操作MongoDB庫

以往我們用Node.js操作MongoDB資料庫如下:

Node.js 查詢 MongoDb 資料庫集合:

MongoClient .connect( dbUrl ,function(err,db){  
        if(err){ /* 資料庫連線失敗 */  
           console .log('資料庫連線失敗');         
           return;     
        }  
        var result=[];  
        var userRel=db.collection('user').find();  
        //res.send(userRel);  
userRel.each(function(err, doc) { if(err){ res.write("遊標遍歷錯誤"); return; } if (doc != null) { result.push(doc); } else { console .log
(result); // 遍歷完畢 db.close(); res.render("index",{ "result" : result }); } }); })

Node.js 給 MongoDb 增加資料 :

MongoClient .connect( dbUrl ,function
(err,db){
if(err){ return } db.collection('user').insertOne({ "name" : name, "age" : age, "score" : { "shuxue" : shuxuechengji, "yuwen" : yuwenchengji } },function(err,result){ if(err){ console .log('寫入資料失敗'); } // 關閉資料庫 db.close(); //res.redirect('/add'); res.redirect('/'); /* 路由跳轉 */ res.end(); ////res.location('/add') }) })

Node.js 修改 MongoDb 資料 :

MongoClient .connect( dbUrl ,function(err,db){     
    if(err){         
        console .log('資料庫連線錯誤');         
        return;     
    }     
    db.collection('user').updateOne({"_id": ObjectID (id)}, 
        {  
            "name": name,         
            "age": age,         
            "score": { 
                "shuxue": shuxue,             
                "yuwen": yuwen         
            }     
        },function (err, results) {         
            console .log(results);         
            db.close();  
            res.redirect('/');   /* 路由跳轉 */         
            res.end('end');     
        }) 
    }) 

Node.js 刪除 MongoDb 資料:

MongoClient .connect( dbUrl ,function(err,db){     
        if(err){         
            throw new Error("資料庫連線失敗");         
            return;     
        }     
        db.collection('user').deleteOne({"_id": ObjectID (id)},function(error,result){         
            if(error){             
                throw  new  Error('刪除資料失敗');            
                return;         
            }         
            db.close();         
            res.redirect('/');   /* 路由跳轉 */     
        }) 
    }) 

我們可以發現不管在操作增刪改查都需要連線一次資料庫,造成有大量重複的程式碼,接下來我們要對這些操作進行封裝,封裝成簡單的幾個方法。

我們可以發現我們操作資料庫進行增刪改查都是先連線資料庫然後在進行對應的增刪改查操作,所以首先我們把MongoBD資料庫連線抽取出來:

    var MongoClient=require('mongodb').MongoClient;

    var DbUrl='mongodb://localhost:27017/test';  /*連線資料庫*/


    function  __connectDb(callback){


        MongoClient.connect(DbUrl,function(err,db){

            if(err){

                console.log('資料庫連線失敗');
                return;
            }
            //增加 修改 刪除

              callback(db);

        })

    }

我們把連線資料庫的部分抽取出來了,不同的只是連線資料庫之後操作的需求是不一樣的,有可能是增加或者修改、刪除、查詢。所以我們給我們的__connectDb方法傳入一個callback方法,這個callback就是對應我們的增加、修改、刪除、查詢操作,等待MongoClient.connect連線完成之後進行回撥我們的callback方法即可。

接下來我們分別對我們的增刪改查操作進行實現:

查詢方法的實現

    exports.find=function(collectionname,json,callback){

        __connectDb(function(db){


            var result=db.collection(collectionname).find(json);

            result.toArray(function(error,data){

                db.close();/*關閉資料庫連線*/
                callback(error,data);/*拿到資料執行回撥函式*/
            })

        })

    }

增加方法的實現

//增加資料
    exports.insert=function(collectionname,json,callback){

        __connectDb(function(db){


            db.collection(collectionname).insertOne(json,function(error,data){

                callback(error,data);
            })
        })

    }

修改方法的實現

//修改資料
    exports.update=function(collectionname,json1,json2,callback){

        __connectDb(function(db){
            db.collection(collectionname).updateOne(json1,{$set:json2},function(error,data){

                callback(error,data);
            })
        })

    }

刪除方法的實現

//刪除資料
    exports.deleteOne=function(collectionname,json,callback){

        __connectDb(function(db){
            db.collection(collectionname).deleteOne(json,function(error,data){
                callback(error,data);
            })
        })

    }

這樣就完成我們一個簡單的MongoDB操作庫。