數(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 collections
或show 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è)置每頁顯示n條數(shù)據(jù)娱仔;
- 查找所有數(shù)據(jù):
- 修改(更新):
- 用新數(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ù)徹底覆蓋舊數(shù)據(jù),默認(rèn)的都是修改一條檩禾;
- 刪除
- 刪除數(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ù)轴总,但集合還存在;
- 命令:
- 刪除數(shù)據(jù)庫:
5 mongodb與nodejs配合使用
- 先決條件
- mongodb與nodejs配合使用步驟
- 引入模塊;
const MongoClient=require("mongodb").MongoClient;
- 設(shè)置數(shù)據(jù)庫url;
const url="mongodb://localhost:27017";
- 連接數(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è)置
- 引入模塊;
- 實例:連接數(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肮之;引用方法;
- 思路:
- 在db.js中引入mongodb模塊卜录;然后連接數(shù)據(jù)庫地址
- 創(chuàng)建mongoConnect(callback)函數(shù)戈擒,通過callback回調(diào)函數(shù),導(dǎo)出client艰毒;
- mongoConnect函數(shù)的作用就是在需要用到db數(shù)據(jù)庫的函數(shù)中筐高,調(diào)用此函數(shù),拿到client,進(jìn)而拿到db丑瞧,進(jìn)而拿到col柑土,通過方法對col集合下的數(shù)據(jù)進(jìn)行操作;
- 封裝方法绊汹,利用匿名函數(shù)設(shè)置形參稽屏,然后在服務(wù)器中引用的時候,導(dǎo)入實參西乖;進(jìn)而完成數(shù)據(jù)操作诫欠;通過回調(diào)函數(shù)callback將封裝方法中的數(shù)據(jù)導(dǎo)出;
- 新建app.js文件浴栽,利用express創(chuàng)建服務(wù)器荒叼;引入自定義模塊db.js;拿到封裝的方法典鸡;
- 通過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類型;
- 查找滿足json條件的所有數(shù)據(jù):
- 修改(更新)數(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)化為字符串;
- 查找數(shù)據(jù)個數(shù):
- 插入一條數(shù)據(jù):
- 封裝后的代碼:
//引入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è)置相對路徑呐馆;
- 引入封裝的js模塊:
- 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ù)組 }) });
- 第一種:查找滿足條件的所有數(shù)據(jù)汹来;
- 參數(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(); }) }) };