Node.js學(xué)習(xí)第六天筆記之mongodb數(shù)據(jù)庫知識

數(shù)據(jù)庫mongodb知識

1 安裝與配置

  • 下載地址:mongodb
  • 按著步驟默認(rèn)安裝焚刚;拿到路徑地址;安裝文檔
  • 配置系統(tǒng)的環(huán)境變量扇调;注:在window8系統(tǒng)中找到path后矿咕,點擊編輯,會彈出變量框狼钮,在原地址后面用分號拼接上安裝的路徑碳柱,路徑到bin文件夾下即可;配置環(huán)境變量鏈接

2 mongodb服務(wù)器與數(shù)據(jù)庫

  • mongodb服務(wù)器與數(shù)據(jù)庫:
    • 安裝mongodb在一個地址中熬芜,這個地址就會創(chuàng)建一個bin文件夾莲镣,文件夾中有mongod.exe應(yīng)用程序,這個文件夾就是服務(wù)器地址涎拉;
    • 運(yùn)行mongo命令瑞侮,必須在bin文件夾下打開cmd,還可以設(shè)置環(huán)境變量鼓拧,在path中用分號連接半火,bin文件夾的路徑;這樣設(shè)置后季俩,在任何地方打開命令行钮糖,均可以使用mongo命令;
    • 設(shè)置存儲路徑种玛,即數(shù)據(jù)庫的地址藐鹤;就是文件增刪改查的地址瓤檐;通過命令mongod --storageEngine mmapv1 --dbpath 數(shù)據(jù)庫存儲數(shù)據(jù)地址;即存儲樣式為mmapv1樣式,ns文件娱节,在頁面中可以看到數(shù)據(jù)庫名稱挠蛉;配置完關(guān)閉窗口;
    • 設(shè)置存儲路徑后肄满,該路徑文件夾下就會生成一些文件谴古,默認(rèn)會生成三個數(shù)據(jù)庫,admin,config,local;
    • 開機(jī):命令mongod --dbpath 數(shù)據(jù)庫存儲數(shù)據(jù)地址稠歉,指的是在該數(shù)據(jù)庫中打開服務(wù)器掰担;注:該窗口不關(guān)閉;
    • 連接服務(wù)器:新建一個cmd怒炸,輸入mongo命令带饱;連接打開的服務(wù)器,然后獲取里面的數(shù)據(jù)庫信息阅羹;
    • 關(guān)機(jī):將打開的服務(wù)器窗口關(guān)閉勺疼,即關(guān)閉了服務(wù)器;
    • 總結(jié):
      • bin文件夾只有一個捏鱼,代表服務(wù)器的路徑执庐;只有一個服務(wù)器;
      • 數(shù)據(jù)庫可以有多個导梆,通過設(shè)置存儲路徑轨淌;即可創(chuàng)建多個數(shù)據(jù)庫;
      • 在哪個數(shù)據(jù)庫中開機(jī)看尼,可以獲取該數(shù)據(jù)庫中的信息递鹉;不同的數(shù)據(jù)庫之間相互獨立狡忙;
  • mongdb的結(jié)構(gòu):
    • mongdb => 多個數(shù)據(jù)庫 => 每個數(shù)據(jù)庫中有多個集合 => 每個集合中有多個document(文檔數(shù)據(jù)格式:json)

3 mongodb常用命令

  • 配置數(shù)據(jù)庫的存儲引擎梳虽,只需要配置一次址芯;
    • 命令:mongod --storageEngine mmapv1 --dbpath 需要存放數(shù)據(jù)的數(shù)據(jù)庫的目錄地址
    • 配置完灾茁,關(guān)閉窗口
  • 開機(jī):mongod --dbpath 數(shù)據(jù)庫的目錄地址
  • 創(chuàng)建mongo數(shù)據(jù)庫的運(yùn)行環(huán)境:
    • 新建一個cmd
    • 輸入:mongo+回車;
  • 清屏:cls;
  • 查看某一個集合下的數(shù)據(jù):db.集合名.find();

4 關(guān)于mongodb的shell命令中的增刪改查

4.1 數(shù)據(jù)庫和集合的增刪查

  • 創(chuàng)建數(shù)據(jù)庫
    • 命令:use Dataname;注:創(chuàng)建數(shù)據(jù)庫后必須在里面創(chuàng)建集合谷炸,否則北专,創(chuàng)建不成功;
  • 刪除數(shù)據(jù)庫
    • 命令:db.dropDatabase();注:要刪除哪個數(shù)據(jù)庫旬陡,就進(jìn)入哪個數(shù)據(jù)庫中運(yùn)行該命令拓颓;"db":查看在哪個數(shù)據(jù)庫中;
  • 創(chuàng)建集合
    • 命令:db.createCollection(name, options);
    • 也可以通過insert命令描孟,向集合中插入數(shù)據(jù)驶睦;也能新建一個集合砰左;插入數(shù)據(jù)和創(chuàng)建集合是同步的;
  • 刪除集合
    • 命令:db.xxx.drop();
  • 查看所有數(shù)據(jù)庫
    • 命令:show dbs;
  • 查看某數(shù)據(jù)庫下的所有集合
    • 命令:show collectionsshow tables
  • 查看當(dāng)前所在的數(shù)據(jù)庫
    • 命令:db;

4.2 集合下數(shù)據(jù)的增刪改查

  • 增加:
    • 一條一條增加:
      • 命令:db.jihe.insert({});
    • 批量導(dǎo)入增加:
      • 命令:mongoimport --db 數(shù)據(jù)庫名字 --collection 集合 --drop --file 要導(dǎo)入的數(shù)據(jù)的地址
      • 命令中的"要導(dǎo)入的數(shù)據(jù)地址"的路徑要注意场航,鼠標(biāo)右鍵屬性中的路徑地址缠导,如:E:\E盤\前端學(xué)習(xí)文件\教學(xué)視頻學(xué)習(xí)\nodeClass\day7\data.json
      • 注:新開一個命令行溉痢,然后輸入命令僻造,導(dǎo)入數(shù)據(jù)庫;
      • 導(dǎo)入的數(shù)據(jù)為json格式的文件孩饼;文件中為josn格式的對象髓削;每個對象之間不需要連接,報紅是正常的镀娶;
  • 查找:
    • 查找所有數(shù)據(jù):db.jihe.find()db.jihe.find({});在后面添加一個pretty()立膛,可以讓信息呈現(xiàn)的漂亮些;
    • 查找指定的數(shù)據(jù):db.jihe.find({"name":"xiaoming"})梯码;
      • find可以找到所有符合條件的數(shù)據(jù)旧巾;
      • findOne 可以找到一條符合條件數(shù)據(jù);
    • 花式查找數(shù)據(jù):利用操作符忍些,查找符合條件的數(shù)據(jù)鲁猩;
      • 操作符:$lt小于;$gt大于
        • 代碼:db.mengsi.find({"age":{$gt:20}});指的是age大于20的所有數(shù)據(jù)罢坝;
        • 代碼:db.mengsi.find({"age":{$lt:40}})廓握;指的是age小于40的所有數(shù)據(jù);
    • 查找的數(shù)據(jù)排序:db.jihe.find().sort({"age":1})
      • 1:正向排序嘁酿;
      • -1:反向排序隙券;
    • 查找總共有多少條數(shù)據(jù):db.jihe.find().count()
    • 查找數(shù)據(jù)分頁顯示闹司;
      • 設(shè)置每頁顯示n條數(shù)據(jù)娱仔;
        • 命令:db.jihe.find().limit(n);指的是每次只顯示前n條數(shù)據(jù)游桩;想查看后面的數(shù)據(jù)牲迫,需要設(shè)置跳過;
      • 設(shè)置跳過多少條數(shù)據(jù)借卧,查看下面的數(shù)據(jù)盹憎;
      • 命令:db.jihe.find().limit(每頁顯示的條數(shù)).skip(需要跳過的條數(shù))
      • eg:db.jihe.find().limit(5).skip(5*2);指的是,顯示跳過10條后的數(shù)據(jù)铐刘,即從第11條開始顯示陪每,顯示5條;
  • 修改(更新):
    • 用新數(shù)據(jù)徹底覆蓋舊數(shù)據(jù),默認(rèn)的都是修改一條檩禾;
      • 命令:db.mengsi.update(oldjson,newjson)
      • eg:db.mengsi.update({"name":"xiaoming"},{"name":"huahua"});指的是將里面的所有數(shù)據(jù)都覆蓋挂签,age數(shù)據(jù)不再存在笆豁;
    • 只更改其中一些數(shù)據(jù)催蝗,不全覆蓋,默認(rèn)的都是修改一條沮协;
      • 命令:db.mengsi.update(oldjson,{$set:newjson})
      • eg:db.mengsi.update({"name":"huanhuan"},{$set:{"name":"zhaomin"}})
    • 修改多條數(shù)據(jù)辆飘,以上的命令均是默認(rèn)修改一條啦辐;
      • 命令:db.mengsi.update(oldjson,{$set:newjson},{"multi":true})
      • eg:db.mengsi.update({"age":{$lt:40}},{$set:{"age":"18"}},{"multi":true});指的是,修改年齡小于40的所有數(shù)據(jù)蜈项,將其中age改為18,其他的數(shù)據(jù)不變芹关;
  • 刪除
    • 刪除數(shù)據(jù)庫:
      • 命令:db.dropDatabase();在要刪除的數(shù)據(jù)庫下,運(yùn)行該命令紧卒,則可以刪除數(shù)據(jù)庫侥衬;
    • 刪除集合:
      • 命令:db.test.drop();刪除test集合;
    • 刪除集合中所有滿足條件中的一條數(shù)據(jù):
      • 命令:db.mengsi.remove({"age":18},{justOne:true}),指的是刪除一條跑芳;
    • 刪除集合中所有滿足條件的數(shù)據(jù):
      • 命令:db.mengsi.remove({"age":{$lt:40}});
    • 刪除集合中的所有數(shù)據(jù):
      • 命令:db.mengsi.remove({});指的是刪除集合下的所有數(shù)據(jù)轴总,但集合還存在;

5 mongodb與nodejs配合使用

  • 先決條件
    • 下載mongdb模塊博个;
    • 注意:2.x版本與3.x版本在命令中有很大的不同怀樟;
  • mongodb與nodejs配合使用步驟
    1. 引入模塊;const MongoClient=require("mongodb").MongoClient;
    2. 設(shè)置數(shù)據(jù)庫url; const url="mongodb://localhost:27017";
    3. 連接數(shù)據(jù)庫地址盆佣,獲取數(shù)據(jù)庫往堡;MongoClient.connect(url,{ useNewUrlParser: true },function(err,client))
      • 設(shè)置{ useNewUrlParser: true },防止報錯;
      • 匿名函數(shù)中:err:錯誤信息共耍;client:獲取db
      • 獲取數(shù)據(jù)庫:const db=client.db(dbName);;其中dbName為數(shù)據(jù)庫的名稱虑灰;
      • 獲取該數(shù)據(jù)庫下的集合:const col=db.collection(collectionName);;其中collectionName為該數(shù)據(jù)庫下的集合名;
      • 通過col來進(jìn)行對集合中的數(shù)據(jù)進(jìn)行增刪改查痹兜;
      • 關(guān)閉與數(shù)據(jù)庫的連接:client.close();
  • 實例:連接數(shù)據(jù)庫穆咐,獲取集合下的所有數(shù)據(jù);渲染到頁面上顯示字旭;
    • 代碼:
     //1.引入模塊
     const MongoClient=require("mongodb").MongoClient;
     //2.服務(wù)器本地域名对湃;
     const url="mongodb://localhost:27017";
     
     //3.連接服務(wù)器,獲取數(shù)據(jù)庫谐算;
     MongoClient.connect(url,{ useNewUrlParser: true },function (err,client) {
         //設(shè)置{ useNewUrlParser: true }熟尉,是為了不報錯归露;
         if(err){
             console.log("連接數(shù)據(jù)庫失敗");
             return;
         }
         console.log("連接數(shù)據(jù)庫成功");
         //獲取數(shù)據(jù)庫洲脂,db,注:3.0以上版本和2.x以上版本有很大區(qū)別;
         //設(shè)置數(shù)據(jù)庫名字
         var dbName="guo";
         const db=client.db(dbName);
         //獲取該數(shù)據(jù)庫下的集合名
         const col=db.collection("mengsi");
         col.find({}).toArray(function (err, items) {//將col集合下的數(shù)據(jù)轉(zhuǎn)化為數(shù)組恐锦;
             if(err){
                 console.log("獲取集合數(shù)據(jù)失敗");
                 return;
             }
             console.log(items);//打印集合數(shù)據(jù)
             client.close();//關(guān)閉數(shù)據(jù)庫往果;
         })
     });
    

6 封裝數(shù)據(jù)庫DAO方法

  • 目的:
    • 封裝nodejs中mongodb的方法,便于調(diào)用使用一铅;
    • 在MVC中的models中創(chuàng)建db.js文件陕贮,用于封裝mongodb的方法,通過exports導(dǎo)出潘飘;
    • 在服務(wù)器中導(dǎo)入自定義模塊db.js肮之;引用方法;
  • 思路:
    1. 在db.js中引入mongodb模塊卜录;然后連接數(shù)據(jù)庫地址
    2. 創(chuàng)建mongoConnect(callback)函數(shù)戈擒,通過callback回調(diào)函數(shù),導(dǎo)出client艰毒;
    3. mongoConnect函數(shù)的作用就是在需要用到db數(shù)據(jù)庫的函數(shù)中筐高,調(diào)用此函數(shù),拿到client,進(jìn)而拿到db丑瞧,進(jìn)而拿到col柑土,通過方法對col集合下的數(shù)據(jù)進(jìn)行操作;
    4. 封裝方法绊汹,利用匿名函數(shù)設(shè)置形參稽屏,然后在服務(wù)器中引用的時候,導(dǎo)入實參西乖;進(jìn)而完成數(shù)據(jù)操作诫欠;通過回調(diào)函數(shù)callback將封裝方法中的數(shù)據(jù)導(dǎo)出;
    5. 新建app.js文件浴栽,利用express創(chuàng)建服務(wù)器荒叼;引入自定義模塊db.js;拿到封裝的方法典鸡;
    6. 通過get請求不同的地址被廓,來操作不同的函數(shù),進(jìn)而引用不同的col方法萝玷,對數(shù)據(jù)進(jìn)行操作嫁乘;
  • 封裝獲取數(shù)據(jù)庫和集合
    • 數(shù)據(jù)庫和集合參數(shù),是在調(diào)用方法時傳入的實參球碉;
    • 獲取數(shù)據(jù)庫:var db=client.db(dbName)
    • 獲取數(shù)據(jù)下的集合:var col=db.collection(collectionName)
  • 封裝時的方法
    • 插入一條數(shù)據(jù):col.insertOne(json,callback);
    • 查找數(shù)據(jù):
      • 查找滿足json條件的所有數(shù)據(jù):col.find(json).toArray(function(err,doc){..});通過toArray中的doc拿到數(shù)據(jù)以數(shù)組的形式獲闰迅;
      • 對查找到的數(shù)據(jù)進(jìn)行排序:col.find(json1).sort(json2).toArray(function (err,doc){});
        • json1:查找滿足條件的json對象睁冬;
        • json2:
          • 取值:{"age":1};指的是按age升序排列挎春;
          • 取值:{"age":-1}看疙;指的是按age降序排列;
          • 默認(rèn)賦值為{}直奋,則亂序排列能庆;
      • 對查找的數(shù)據(jù)進(jìn)行分頁顯示:col.find(json1).limit(pageamount).skip(page*pageamount).toArray(function (err,doc){});
        • json1:查找滿足條件的json對象;
        • pageamount:指每頁顯示數(shù)據(jù)的個數(shù)脚线;
        • page:指第幾頁顯示搁胆,實質(zhì)就是跳過多少數(shù)據(jù)顯示;
          • page為0邮绿,則跳過0條渠旁,從第一條開始顯示,總共顯示pageamount條數(shù)據(jù)船逮;
          • page為1一死,則跳過1*pageamount條,則從pageamount+1條開始顯示傻唾,總共顯示pageamount條數(shù)據(jù)投慈;
        • page和pageamount賦值為Number類型;
    • 修改(更新)數(shù)據(jù):
      • 修改多條:col.updateMany(json1,json2,function (err,result){})
        • json1:查找滿足條件的json對象數(shù)據(jù)冠骄,待修改伪煤;
        • json2:修改后的json對象數(shù)據(jù);其中設(shè)置$set則只修改其中的一個屬性凛辣,否則為全覆蓋抱既;
        • 修改所有滿足條件的數(shù)據(jù);
    • 刪除數(shù)據(jù):
      • 刪除多條:col.deleteMany(json,function (err,result){})
        • json:查找待刪除的數(shù)據(jù)扁誓;
        • 刪除所有滿足條件的數(shù)據(jù)防泵;
    • 查找滿足條件的數(shù)據(jù)的總個數(shù):
      • 查找數(shù)據(jù)個數(shù):col.countDocuments(json,function (err,count){})
        • json:查找數(shù)據(jù)的條件;
        • count:拿到的是總個數(shù)蝗敢,為Number類型捷泞;
        • 注意:在響應(yīng)頁面時的res.send()中,不能放Number類型寿谴,所以需要通過toString()方法锁右,將其轉(zhuǎn)化為字符串;
  • 封裝后的代碼:
     //引入mongodb模塊
     const MongoClient=require("mongodb").MongoClient;
     //數(shù)據(jù)庫地址
     const url="mongodb://localhost:27017";
     
     //連接數(shù)據(jù)庫
     function mongoConnect(callback) {
         MongoClient.connect(url,{ useNewUrlParser: true },function (err, client) {
             if(err){
                 console.log("連接數(shù)據(jù)庫失敗");
                 return;
             }
             console.log("連接數(shù)據(jù)庫成功");
             //將client通過callback回調(diào)函數(shù)傳出讶泰;
             callback(client);
         });
     }
     
     //1.在數(shù)據(jù)庫中指定集合插入一條數(shù)據(jù)咏瑟;
     //參數(shù):數(shù)據(jù)庫,集合, 插入數(shù)據(jù)痪署,callback導(dǎo)出信息
     exports.insertOne=function (dbname, collectionName, json, callback) {
         mongoConnect(function (client) {
             //獲取數(shù)據(jù)庫db,注:3.0以上版本獲取數(shù)據(jù)庫會有差異码泞;
             var db=client.db(dbname);
             var col=db.collection(collectionName);
             col.insertOne(json,function (err, result) {
                 callback(err,result);
                 client.close();//關(guān)閉與數(shù)據(jù)庫的連接
             })
         })
     };
     
     //2.查找數(shù)據(jù)庫中集合下的數(shù)據(jù)
     //參數(shù):數(shù)據(jù)庫 集合 待查找的數(shù)據(jù)  分頁和排序參數(shù) callback導(dǎo)出信息
     //其中第四個分頁和排序參數(shù)可傳可不傳;
     exports.find=function (dbname,collectionName,json1,json2,callback) {
         if(arguments.length===4){
             //說明json2沒有傳狼犯;第四個參數(shù)傳的是回調(diào)余寥;
             callback=json2;
             json2={};
         }
         var sort=json2.sort || {};//默認(rèn)值為空對象领铐,即亂序;
         var limit=Number(json2.limit) || 0;//默認(rèn)值為0,必須為數(shù)字
         var skip=Number(json2.skip) || 0;//默認(rèn)跳過0劈狐;
         mongoConnect(function (client) {
             var db=client.db(dbname);
             var col=db.collection(collectionName);
             //用toArray將獲取的數(shù)據(jù)以數(shù)組的形式傳出罐孝;
             col.find(json1).sort(sort).limit(limit).skip(skip*limit).toArray(function (err, doc) {
                 callback(err,doc);
                 client.close();//關(guān)閉與數(shù)據(jù)庫的鏈接
             })
         })
     };
     //3 修改更新多條數(shù)據(jù)
     //參數(shù):數(shù)據(jù)庫 集合 待修改數(shù)據(jù)  修改后的數(shù)據(jù) callback導(dǎo)出信息
     exports.updateMany=function (dbname, collectionName, json1, json2, callback) {
         mongoConnect(function (client) {
             var db=client.db(dbname);
             var col=db.collection(collectionName);
             col.updateMany(json1,json2,function (err, result) {
                 callback(err,result);
                 client.close();
             })
         })
     };
     //4 刪除多條
     //參數(shù):數(shù)據(jù)庫 集合 待刪除 callback導(dǎo)出信息
     exports.deleteMany=function (dbname, collectionName, json, callback) {
         mongoConnect(function (client) {
             var db=client.db(dbname);
             var col=db.collection(collectionName);
             col.deleteMany(json,function (err, result) {
                 callback(err,result);
                 client.close();
             })
         })
     };
     //5 獲取集合下滿足條件的總個數(shù)
     //參數(shù):數(shù)據(jù)庫 集合 數(shù)據(jù) callback導(dǎo)出信息
     exports.count=function (dbname, collectionName, json, callback) {
        mongoConnect(function (client) {
            var db=client.db(dbname);
            var col=db.collection(collectionName);
            col.countDocuments(json,function (err, count) {
                callback(err,count);
                client.close();
            })
        })
     };
    

7 使用封裝后的方法

  • 1.引入自定義模塊
    • 引入封裝的js模塊:const db=require("./models/db");注:必須設(shè)置相對路徑呐馆;
  • 2.引用插入一條數(shù)據(jù)方法:insertOne
    • 參數(shù):1)數(shù)據(jù)庫名 2)集合名 3)插入的數(shù)據(jù)json 4)callback回調(diào)函數(shù)導(dǎo)出結(jié)果信息肥缔;
    • 代碼:
     db.insertOne("yanzheng","tiankong",{"name":"meili","age":5},function (err, result) {
         if(err){
             console.log(err);
             return;
         }
         res.send(result);
     })
    
  • 3.引用查找數(shù)據(jù)方法:find
    • 參數(shù):分為兩種;
      • 第一種:查找滿足條件的所有數(shù)據(jù)汹来;
        • 四個參數(shù):1)數(shù)據(jù)庫名 2)集合名 3)查找的數(shù)據(jù)json 4)callback回調(diào)函數(shù)導(dǎo)出結(jié)果信息续膳;
        • 代碼:
         db.find("yanzheng","tiankong",{"age":5},function (err, result) {
             if(err){
                 console.log(err);
                 return;
             }
             res.send(result);//result返回的是一個數(shù)組
         })
        
      • 第二種:查找數(shù)據(jù)并排序和分頁;
        • 五個參數(shù):1)數(shù)據(jù)庫名 2)集合名 3)查找的數(shù)據(jù)json 4)排序和分頁(json對象) 5)callback回調(diào)函數(shù)導(dǎo)出結(jié)果信息收班;
        • 排序和分頁設(shè)置模板:{"sort":{"age":-1},"limit":pageamount,"skip":page};
        • 其中排序sort設(shè)置{"age":1}為升序排列坟岔;page和pageamount為分頁的頁碼和每頁展示數(shù)據(jù);
        • 可以在地址欄中的設(shè)置?page=xx&pageamount=xx參數(shù),通過req.query來獲取page和pageamount值摔桦,再進(jìn)行設(shè)置社付;
        • 代碼:
         formApp.get("/find",function (req, res) {
             //地址欄:http://localhost:8080/find?page=0&pageamount=10
             //通過req.query來拿到地址中的存在;
             var pageamount=req.query.pageamount;//拿到的數(shù)據(jù)是string,在db.js中通過Number轉(zhuǎn)化為數(shù)字邻耕,否則鸥咖,會報錯
             var page=req.query.page;
             db.find("yanzheng","tiankong",{"age":5},{"sort":{"age":-1},"limit":pageamount,"skip":page},function (err, result) {
                 if(err){
                     console.log(err);
                     return;
                 }
                 res.send(result);//result返回的是一個數(shù)組
             })
         });
        
  • 4.引用修改多條命令:updateMany
    • 參數(shù):1)數(shù)據(jù)庫名 2)集合名 3)待修改的數(shù)據(jù)json 4)修改后的數(shù)據(jù)json 5)callback回調(diào)函數(shù)導(dǎo)出結(jié)果信息;
    • 代碼:
     db.updateMany("yanzheng","tiankong",{"age":5},{$set:{"name":"guobin"}},function (err, result) {
        if(err){
            console.log(err);
            return;
        }
        res.send(result);
    })
    
  • 5.引用刪除多條命令:deleteMany
    • 參數(shù):1)數(shù)據(jù)庫名 2)集合名 3)待刪除的數(shù)據(jù)json 4)callback回調(diào)函數(shù)導(dǎo)出結(jié)果
    • 代碼:
     db.deleteMany("yanzheng","tiankong",{"age":5},function (err, result) {
        if(err){
            console.log(err);
            return;
        }
        res.send(result);
     })
    
  • 6.引用查找滿足條件的數(shù)據(jù)總個數(shù):count
    • 參數(shù):1)數(shù)據(jù)庫名 2)集合名 3)查找滿足條件的數(shù)據(jù)json 4)callback回調(diào)函數(shù)導(dǎo)出結(jié)果
    • 代碼:
     db.count("yanzheng","tiankong",{"age":5},function (err, result) {
         if(err) {
             console.log(err);
             return;
         }
         res.send(result.toString());//send中不能放數(shù)字兄世,拿到的result為數(shù)字啼辣;
     })
    
  • 服務(wù)器中請求與方法的使用;
    • 代碼:
     const express=require("express");
     //引入自定義模塊御滩,需要設(shè)置相對路徑鸥拧;
     const db=require("./models/db");
     const formApp=express();
     
     //1. 發(fā)送請求,插入一條數(shù)據(jù)
     //get:"/addOne" => 向數(shù)據(jù)庫yanzheng下的tiankong集合中插入一條{"name":"meili","age":5}的數(shù)據(jù)削解;
     formApp.get("/addOne",function (req, res) {
         db.insertOne("yanzheng","tiankong",{"name":"meili","age":5},function (err, result) {
             if(err){
                 console.log(err);
                 return;
             }
             res.send(result);
         })
     });
     
     //2. 發(fā)送"/find"請求富弦,查找數(shù)據(jù)
     //get:"/find" => 查找yanzheng數(shù)據(jù)庫中tiankong集合下數(shù)據(jù)為{"age":5}的所有數(shù)據(jù),進(jìn)行降序排列氛驮,顯示幾條和跳過幾條舆声;
     formApp.get("/find",function (req, res) {
         //地址欄:http://localhost:8080/find?page=0&pageamount=10
         //通過req.query來拿到地址中的存在;
         var pageamount=req.query.pageamount;//拿到的數(shù)據(jù)是string,在db.js中通過Number轉(zhuǎn)化為數(shù)字柳爽,否則媳握,會報錯
         var page=req.query.page;
         //傳五個實參:1)數(shù)據(jù)庫 2)集合名 3)查找的數(shù)據(jù)(json對象) 4)分頁和排序(json對象) 5)callback
         //其中第四個分頁和排序參數(shù)可傳可不傳;
         //第四個分頁和排序參數(shù)模板:{"sort":{"age":-1},"limit":pageamount,"skip":page}
         db.find("yanzheng","tiankong",{"age":5},{"sort":{"age":-1},"limit":pageamount,"skip":page},function (err, result) {
             if(err){
                 console.log(err);
                 return;
             }
             res.send(result);//result返回的是一個數(shù)組
         })
     });
     
     //3. 發(fā)送請求"/update"磷脯,更改數(shù)據(jù)
     //get:"/update" => 修改yanzheng數(shù)據(jù)庫下tiankong集合中的滿足{"age":5}條件的所有數(shù)據(jù)中的name值修改為guobin;
     formApp.get("/update",function (req, res) {
        db.updateMany("yanzheng","tiankong",{"age":5},{$set:{"name":"guobin"}},function (err, result) {
            if(err){
                console.log(err);
                return;
            }
            res.send(result);
        })
     });
     
     //4. 發(fā)送請求"/delete",刪除數(shù)據(jù)
     //get:"/delete" => 刪除yanzheng數(shù)據(jù)庫下tiankong集合下的滿足條件的所有數(shù)據(jù)蛾找;
     formApp.get("/delete",function (req, res) {
        db.deleteMany("yanzheng","tiankong",{"age":5},function (err, result) {
            if(err){
                console.log(err);
                return;
            }
            res.send(result);
        })
     });
     //5. 發(fā)送請求"/count",獲取集合下滿足情況的所有數(shù)據(jù)
     //get:"/count" => 獲取yanzheng數(shù)據(jù)庫下tiankong集合下滿足條件的數(shù)據(jù)總個數(shù);
     formApp.get("/count",function (req, res) {
         db.count("yanzheng","tiankong",{"age":5},function (err, result) {
             if(err) {
                 console.log(err);
                 return;
             }
             res.send(result.toString());//send中不能放數(shù)字赵誓,拿到的result為數(shù)字打毛;
         })
     });
     
     //監(jiān)聽端口號
     formApp.listen(8080);
    
    

8 數(shù)據(jù)庫方法的封裝精化

  • 根據(jù)上面的封裝中柿赊;將數(shù)據(jù)庫地址和數(shù)據(jù)庫名字,單獨通過setting.js文件進(jìn)行設(shè)置幻枉;然后引入到db.js文件中碰声,這樣就可以在setting中設(shè)置數(shù)據(jù)庫地址和數(shù)據(jù)庫名字,簡單方便熬甫;
  • 改進(jìn)后的代碼:
    • 設(shè)置數(shù)據(jù)庫地址和數(shù)據(jù)庫名字的setting.js文件代碼:
     //設(shè)置數(shù)據(jù)庫地址
     exports.url="mongodb://localhost:27017";
     //設(shè)置數(shù)據(jù)庫名稱
     exports.dbName="login";
    
    • 封裝的mongodb.js文件代碼:
     //引入mongodb模塊
     const MongoClient=require("mongodb").MongoClient;
     //引入自定義模塊setting
     const setting=require("../setting-liuyan");
     //數(shù)據(jù)庫地址
     const url=setting.url;
     //數(shù)據(jù)庫名
     const dbname=setting.dbName;
     
     //連接數(shù)據(jù)庫
     function mongoConnect(callback) {
         MongoClient.connect(url,{ useNewUrlParser: true },function (err, client) {
             if(err){
                 console.log("連接數(shù)據(jù)庫失敗");
                 return;
             }
             //將client通過callback回調(diào)函數(shù)傳出胰挑;
             callback(client);
         });
     }
     
     //1.在數(shù)據(jù)庫中指定集合插入一條數(shù)據(jù);
     //參數(shù):集合, 插入數(shù)據(jù)椿肩,callback導(dǎo)出信息
     exports.insertOne=function (collectionName, json, callback) {
         mongoConnect(function (client) {
             //獲取數(shù)據(jù)庫db,注:3.0以上版本獲取數(shù)據(jù)庫會有差異瞻颂;
             var db=client.db(dbname);
             var col=db.collection(collectionName);
             col.insertOne(json,function (err, result) {
                 callback(err,result);
                 client.close();//關(guān)閉與數(shù)據(jù)庫的連接
             })
         })
     };
     
     //2.查找數(shù)據(jù)庫中集合下的數(shù)據(jù)
     //參數(shù):集合 待查找的數(shù)據(jù)  分頁和排序參數(shù) callback導(dǎo)出信息
     //其中第三個分頁和排序參數(shù)可傳可不傳;
     exports.find=function (collectionName,json1,json2,callback) {
         if(arguments.length===3){
             //說明json2沒有傳郑象;第三個參數(shù)傳的是回調(diào)贡这;
             callback=json2;
             json2={};
         }
         var sort=json2.sort || {};//默認(rèn)值為空對象,即亂序厂榛;
         var limit=Number(json2.pageamount) || 0;//默認(rèn)值為0,必須為數(shù)字
         var skip=Number(json2.page) || 0;//默認(rèn)跳過0盖矫;
         mongoConnect(function (client) {
             var db=client.db(dbname);
             var col=db.collection(collectionName);
             //用toArray將獲取的數(shù)據(jù)以數(shù)組的形式傳出;
             col.find(json1).sort(sort).limit(limit).skip(skip*limit).toArray(function (err, doc) {
                 callback(err,doc);
                 client.close();//關(guān)閉與數(shù)據(jù)庫的鏈接
             })
         })
     };
     //3 修改更新數(shù)據(jù)
     //參數(shù):集合 待修改數(shù)據(jù)  修改后的數(shù)據(jù) callback導(dǎo)出信息
     exports.updateMany=function (collectionName, json1, json2, callback) {
         mongoConnect(function (client) {
             var db=client.db(dbname);
             var col=db.collection(collectionName);
             col.updateMany(json1,json2,function (err, result) {
                 callback(err,result);
                 client.close();
             })
         })
     };
     //4 刪除
     //參數(shù):集合 待刪除 callback導(dǎo)出信息
     exports.deleteMany=function (collectionName, json, callback) {
         mongoConnect(function (client) {
             var db=client.db(dbname);
             var col=db.collection(collectionName);
             col.deleteMany(json,function (err, result) {
                 callback(err,result);
                 client.close();
             })
         })
     };
     //5 獲取集合下滿足條件的總個數(shù)
     //參數(shù):集合 數(shù)據(jù) callback導(dǎo)出信息
     exports.count=function (collectionName, json, callback) {
        mongoConnect(function (client) {
            var db=client.db(dbname);
            var col=db.collection(collectionName);
            col.countDocuments(json,function (err, count) {
                callback(err,count);
                client.close();
            })
        })
     };
    

簡書鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末击奶,一起剝皮案震驚了整個濱河市辈双,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌正歼,老刑警劉巖辐马,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異局义,居然都是意外死亡喜爷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進(jìn)店門萄唇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來檩帐,“玉大人,你說我怎么就攤上這事另萤∨让埽” “怎么了?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵四敞,是天一觀的道長泛源。 經(jīng)常有香客問我,道長忿危,這世上最難降的妖魔是什么达箍? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮铺厨,結(jié)果婚禮上缎玫,老公的妹妹穿的比我還像新娘硬纤。我一直安慰自己,他們只是感情好赃磨,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布筝家。 她就那樣靜靜地躺著,像睡著了一般邻辉。 火紅的嫁衣襯著肌膚如雪溪王。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天恩沛,我揣著相機(jī)與錄音在扰,去河邊找鬼缕减。 笑死雷客,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的桥狡。 我是一名探鬼主播搅裙,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼裹芝!你這毒婦竟也來了部逮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤嫂易,失蹤者是張志新(化名)和其女友劉穎兄朋,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怜械,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡颅和,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了缕允。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片峡扩。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖障本,靈堂內(nèi)的尸體忽然破棺而出教届,到底是詐尸還是另有隱情,我是刑警寧澤驾霜,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布案训,位于F島的核電站,受9級特大地震影響粪糙,放射性物質(zhì)發(fā)生泄漏强霎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一猜旬、第九天 我趴在偏房一處隱蔽的房頂上張望脆栋。 院中可真熱鬧倦卖,春花似錦、人聲如沸椿争。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秦踪。三九已至褐捻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間椅邓,已是汗流浹背柠逞。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留景馁,地道東北人板壮。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像合住,于是被迫代替她去往敵國和親绰精。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

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

  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,456評論 0 13
  • 關(guān)于Mongodb的全面總結(jié) MongoDB的內(nèi)部構(gòu)造《MongoDB The Definitive Guide》...
    中v中閱讀 31,936評論 2 89
  • 《無人區(qū)》里有句話:人和動物的最大區(qū)別是透葛,人會用火笨使。 前段時間,和我媽一起在地里摘黑豆僚害。但因為豆子長的比較少硫椰,而枝...
    蔡曉冰閱讀 444評論 4 2
  • 文/何憶飛鴻影 十一小長假靶草,是全國各大旅游景點的旺季,人們從工作崗位走下來门岔,享受難得的一周愜意爱致。都說十一小長假人山...
    何憶飛鴻影閱讀 1,028評論 2 17
  • 親情就是這樣:你越折騰糠悯,別人越想著辦法在乎你。 你越安靜妻往,你就是可以被忽略的那個互艾。 你盡一切努力讓自己優(yōu)秀,卻總是...
    誰與光閱讀 224評論 0 0