NodeJS 對 MongoDB 封裝

開始之前

按照 MongoDB Node.JS Driver 我們每次使用JS對數(shù)據(jù)進(jìn)行操作都需要先建立連接兴喂,如果我們每次操作都要重新建立一次連接必然會很消耗性能(建立連接時長大約一秒鐘)改抡,為了減少性能的損耗同時使我們用 nodejs 操作 MongoDB 更加靈活方便唉锌,按照官方文檔封裝一個了 DB 模塊。

原生 JS 中靜態(tài)方法、類、繼承

function Persion(name,age){
  /* 構(gòu)造函數(shù)里面的方法和屬性 */
  this.name = name;
  this.age = age;
  this.printInfo = function(){
    console.log(`${this.name}---${this.age}`)
  }
}

/* 原型鏈上的屬性和方法和可以被多個實例共享 */
Person.prototype.sex = 'man';
Persion.prototype.work = function(){
  console.log(`${this.name}--${this.age}--${this.work}`)
}

/* 靜態(tài)方法 我們直接在方法名上添加就可以使用方法方法名調(diào)用 */
Person.staticMethod = function(){
  console.log('這是一個靜態(tài)方法')
}

/* 實例方法是通過實例化來調(diào)用原献,靜態(tài)方法是通過類名調(diào)用 */
let p = new Person('zhangsan', '18');
p.printInfo();  // zhangsan--18
p.work(); // zhangsan--18--man
Person.staticMethod(); // 這是一個靜態(tài)方法

ES5中的繼承

/* 
 *  ES5中的繼承可用使用原型鏈繼承和對象冒充的方式來實行
 *  對象冒充繼承:沒法繼承原型鏈上的屬性和方法
 *  原型鏈繼承:可以繼承構(gòu)造函數(shù)以及原型鏈上面的屬性和方法,但實例化子類時沒法傳參數(shù)給父類
 *  將這兩者結(jié)合起來埂淮,更多的方法請查看 《JavaScript高級程序設(shè)計》 第六章
*/

function Person(name,age){
  this.name = name;
  this.age = age;
  this.printInfo = function(){
     console.log(`${this.name}--${this.age}`);
  }
}

Person.prototype.work = function(){
  console.log('work')
}

function Employee(name,age){
  Person.call(this,name,age) // 對象冒充實現(xiàn)繼承
}

Employee.prototype = new Person();

let emp = new Employee('zhangsan', 18);

emp.printInfo(); // zhangsan--18

emp.work(); // work

ES6 中類姑隅、靜態(tài)方法、繼承

class Person{
  constructor(name,age){
    this._name = name;
    this._age = age;
  }
  getName(){
    console.log(this._name);
  }
  setName(name){
    this._name = name;
  }
}

/* ES6 中的繼承 使用 extends 關(guān)鍵字  靜態(tài)方法使用 static 關(guān)鍵字*/
class Employee extends Person{
  constructor(name,age,sex){
    super(name,age);
    this._sex = sex;
  }
  static staticMethod(){
    console.log('這是一個靜態(tài)方法')倔撞;
  }
  printInfo(){
    console.log(`${this._name}--${this._age}--${this._sex}`);
  }
}
let emp = new Employee('zhangsan', '18', 'man');
emp.getName(); // zhangsan
emp.printInfo(); // zhangsan--18--man
Employee.staticMethod(); //這是一個靜態(tài)方法

ES6單例模式

class Db {
    static getInstance(){   /*單例*/
        if(!Db.instance){
            Db.instance=new Db();
        }
        return Db.instance;
    }
    constructor(){
        console.log('實例化會觸發(fā)構(gòu)造函數(shù)');
        this.connect();
    }
    connect(){
        console.log('連接數(shù)據(jù)庫');
    }
    find(){
        console.log('查詢數(shù)據(jù)庫');
    }
}
var myDb=Db.getInstance(); // 實例化會觸發(fā)構(gòu)造函數(shù) 連接數(shù)據(jù)庫
var myDb2=Db.getInstance(); 
var myDb3=Db.getInstance();
var myDb4=Db.getInstance();
myDb3.find(); //查詢數(shù)據(jù)庫
myDb4.find(); //查詢數(shù)據(jù)庫

NodeJS 對 MongoDB的封裝

const MongoDB = require('mongodb');
const MongoClient = MongoDB.MongoClient;
const ObjectID = MongoDB.ObjectID;
const CONFIG = {
    dbUrl: 'mongodb://127.0.0.1:27017/',
    dbName: 'test'
};

class DB{
    static getInstance(){
        if(!DB.instance){
            DB.instance = new DB();
        }
        return DB.instance;
    }
    constructor() {
        this.dbClient = '';
        this.connect();
    }
    connect(){
        let self = this;
        return new Promise(((resolve, reject) => {
            if(!self.dbClient){
                MongoClient.connect(CONFIG.dbUrl,{'useNewUrlParser': true, 'useUnifiedTopology':true},(err,client)=>{
                    if(err){
                        reject(err);
                    }else{
                        self.dbClient = client.db(CONFIG.dbName);
                        resolve(self.dbClient);
                    }
                })
            }else{
                resolve(self.dbClient);
            }
        }))
    }
    insertDocuments(collectionName,jsonArr){
        if(!collectionName || !jsonArr || !(jsonArr instanceof Array)) throw '參數(shù)錯誤';
        return new Promise((resolve, reject) => {
            this.connect().then(db=>{
                const collect = db.collection(collectionName);
                collect.insertMany(jsonArr,(err,result)=>{
                    if(!err){
                        resolve(result);
                    }else{
                        reject(err);
                    }
                })
            })
        })
    }
    findDocuments(collectionName,json){
        if(!collectionName || !json ) throw '參數(shù)錯誤';
        return new Promise((resolve, reject) => {
            this.connect().then(db=>{
                let result = db.collection(collectionName).find(json);
                result.toArray((err,data)=>{
                    if(!err){
                        resolve(data);
                    }else{
                        reject(err);
                    }
                })
            })
        })
    }
    removeDocument(collectionName,json){
        if(!collectionName || !json ) throw '參數(shù)錯誤';
        return new Promise(((resolve, reject) => {
            this.connect().then(db=>{
                const collection = db.collection(collectionName);
                collection.deleteOne(json,(err,result)=>{
                    if(!err){
                        resolve(result);
                    }else{
                        reject(err);
                    }
                })
            })
        }))
    }
    updateDocument(collectionName,filter,json){
        if(!collectionName || !filter || !json) throw '參數(shù)錯誤';
        return new Promise((resolve, reject) => {
            this.connect().then(db=>{
                const collection = db.collection(collectionName);
                collection.updateOne(filter,{$set:json},(err,result)=>{
                    if(!err){
                        resolve(result)
                    }else{
                        reject(err)
                    }
                })
            })
        })
    }
    getObjectId(id){    /*mongodb里面查詢 _id 把字符串轉(zhuǎn)換成對象*/
        return new ObjectID(id);
    }
}

module.exports = DB.getInstance();
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末讲仰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子误窖,更是在濱河造成了極大的恐慌叮盘,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件霹俺,死亡現(xiàn)場離奇詭異柔吼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)丙唧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進(jìn)店門愈魏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人想际,你說我怎么就攤上這事培漏。” “怎么了胡本?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵牌柄,是天一觀的道長。 經(jīng)常有香客問我侧甫,道長珊佣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任披粟,我火速辦了婚禮咒锻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘守屉。我一直安慰自己惑艇,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布拇泛。 她就那樣靜靜地躺著滨巴,像睡著了一般。 火紅的嫁衣襯著肌膚如雪俺叭。 梳的紋絲不亂的頭發(fā)上兢卵,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機(jī)與錄音绪颖,去河邊找鬼秽荤。 笑死,一個胖子當(dāng)著我的面吹牛柠横,可吹牛的內(nèi)容都是我干的窃款。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼牍氛,長吁一口氣:“原來是場噩夢啊……” “哼晨继!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起搬俊,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤紊扬,失蹤者是張志新(化名)和其女友劉穎蜒茄,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體餐屎,經(jīng)...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡檀葛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了腹缩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片屿聋。...
    茶點(diǎn)故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖藏鹊,靈堂內(nèi)的尸體忽然破棺而出润讥,到底是詐尸還是另有隱情,我是刑警寧澤盘寡,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布楚殿,位于F島的核電站,受9級特大地震影響竿痰,放射性物質(zhì)發(fā)生泄漏勒魔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一菇曲、第九天 我趴在偏房一處隱蔽的房頂上張望冠绢。 院中可真熱鬧,春花似錦常潮、人聲如沸弟胀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孵户。三九已至,卻和暖如春岔留,著一層夾襖步出監(jiān)牢的瞬間夏哭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工献联, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留竖配,地道東北人。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓里逆,卻偏偏與公主長得像进胯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子原押,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評論 2 356

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

  • 面試題一:https://github.com/jimuyouyou/node-interview-questio...
    R_X閱讀 1,624評論 0 5
  • 目錄Nodejs的介紹15個Nodejs應(yīng)用場景Nodejs學(xué)習(xí)路線圖 Nodejs的介紹Node.js的是建立在...
    寒劍飄零閱讀 10,353評論 3 205
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持胁镐,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 3,658評論 2 27
  • 1盯漂、移動端你遇到過什么兼容問題?1颇玷、如果在input設(shè)置邊框顏色在ios系統(tǒng)里會出現(xiàn)兼容性問題,需要在外面加一個d...
    阿帕奇喲閱讀 806評論 0 8
  • 歡笑依舊是那么燦爛 恰如你和我 走在這條紊亂的石板街上 大家一如平常的點(diǎn)頭哈腰 我的左手就放在腰上荷包的位置 緊緊...
    流浪貓70s閱讀 66評論 0 1