第一步
使用npm下載 mongodb模塊
第二步
后台導入mongodb模塊
注意:引入的模塊會先去找自己文件夾中的node_modules中的模塊,如果沒有,再去找全局(node安裝目錄中的)
let http = require("http");
let mongodb = require('mongodb'); // 導入mongodb的模塊
let MongoClient = mongodb.MongoClient;// 創建連接數據庫的對象
連接上數據庫后就可以在后台對數據庫進行操作了
后台服務中原生寫法,代碼解讀
let http = require("http"); // 導入mongodb的模塊 let mongodb = require('mongodb'); //引入的模塊會先去找自己文件夾中的node_modules中的模塊,如果沒有,再去找全局(node安裝目錄中的) // 創建連接數據庫的對象 let MongoClient = mongodb.MongoClient; let server = http.createServer(); server.on("request",(req,res) => { let database_url = "mongodb://localhost:27017/"; //數據庫的地址 let database_name = "school"; //數據庫名稱 let url = database_url + database_name; //數據庫的地址加數據庫名稱 MongoClient.connect(url, (err, db) => { //連接數據庫 // err表示錯誤信息,數據庫連接失敗的時候err才會有值 db是數據的實例,連接成功以后,所有的操作都是在這個實例進行完成 if(err){ console.log('數據庫連接失敗'); return; } console.log('連接成功'); var obj = {"name":"小明把","age":120,"hobby":["睡覺a","吃飯a"],"score":{"yuwen":590,"shuxue":800}} db.collection("student").insertMary(obj, (err, result) => { //向school數據庫中,student的集合中插入一條數據 if (err){ console.log('插入失敗'); return; } console.log(result); //一個對象,里面有關於數據庫,和插入數據的方法和屬性 res.end(result.toString())
db.close();// db.close(); //數據庫關閉每一次數據庫進行一次操作以后,使用完成,都要關閉
});
});
}) server.listen(3000);
相關的增刪改查方法
數據庫中可以有多個集合,一個集合可以有多個數據,數據一個集合為數組,多條數據為對象的格式(json)存儲
db.collection("集合名")方法,如果數據庫中沒有該集合,那么在增刪查改的時候會默認添加集合
插入多條數據
db.collection("集合名").insertMany(插入的數據(對象格式), function(err, result) { if (err) throw err; db.close(); //操作后關閉數據庫 });
插入一條數據
db.collection("集合名").insertOne(插入的數據(對象格式),function(err, res) {
if (err) throw err; console.log("文檔插入成功");
db.close();
});
查詢數據
db.collection("集合名"). find(查找的數據(對象)).toArray(function(err, result) { // 返回查找到的數據 if (err) throw err; console.log(result); //返回查找到符合查找對象的數據,數組包對象 db.close(); });
更新數據(修改數據)
更新一條
db.collection("site").updateOne(被替換的數據(對象), 更新的數據(對象), function(err, res) { if (err) throw err; console.log("文檔更新成功"); db.close(); });
注意:修改數據可以只是修改集合中某條數據的部分數據
更新多條
var whereStr = {"type":'en'}; // 查詢條件 var updateStr = {$set: { "url" : "https://www.runoob.com" }}; dbo.collection(集合名).updateMany(whereStr, updateStr, function(err, res) { if (err) throw err; console.log(res.result.nModified + " 條文檔被更新"); //result.nModified 為更新的條數。 db.close(); });
$set 如果沒有找到,則會創建對應數據,插入集合中
將$set換為 $unset 進行更新,則會刪除這個字段
刪除數據
刪除條件滿足的第一條數據
db.collection(集合名).deleteOne(查找的條件(對象), function(err, obj) { if (err) throw err; console.log("文檔刪除成功"); db.close(); });
刪除多條數據
刪除符合條件的所有數據
db.collection(集合名).deleteMany(查找條件(對象), function(err, obj) { if (err) throw err; console.log(obj.result.n + " 條文檔被刪除"); db.close(); });
查詢分頁
dbo.collection(集合名).find().skip(2).limit(2).toArray(function(err, result) { if (err) throw err; console.log(result); //result返回查詢到經過分頁處理的數據 db.close(); });
skip(num)查詢到的所有數據中,跳過num條數據后 返回查詢結果
limit(num)查詢到的所有數據中,返回num條數據
分頁查詢可以用於當數據過於龐大,進行部分查找
DAO層理解及封裝
DAO層緣由
起源於java,java的dao可以寫的非常大
做專門連接數據庫的層,然后暴露接口給后台進行訪問
DAO邏輯
DAO層的設計首先是設計DAO的接口,然后就可在模塊中調用此接口來進行數據業務的處理,
而不用關心此接口的具體實現類是哪個類,顯得結構非常清晰,DAO層的數據源配置。
DAO層作用
主要是做數據持久層的工作,負責與數據庫進行聯絡的一些任務都封裝在此
簡而言之:它是通過引入模塊 ,將對數據庫操作的方法封裝,然后暴露接口,供后台操作,就是在后天與數據庫中間的中間層
在node 中,DAO層也是可以寫的非常大。
以下是node連接mongodb的DAO層
var mongodb = require("mongodb"); var MongoClient = mongodb.MongoClient; function _connectDB(callback){ let database_url = "mongodb://localhost:27017/"; //數據庫的地址 let database_name = "data"; //數據庫名稱 let url = database_url + database_name; MongoClient.connect(url,function(err,db){ if(err){ callback(err,null); return; } callback(err,db); }) } // 暴露接口 // 插入數據 exports.insertOne = function(collectionName,json,callback){ _connectDB(function(err,db){ db.collection(collectionName).insertOne(json, (err, result) => { // if(err){ // callback(err,null) // return; // } callback(err,result); db.close(); }); }) } // 刪除的接口 exports.deleteMany = function(collectionName,json,callback){ _connectDB(function(err,db){ db.collection(collectionName).deleteMany(json,function(err,result){ callback(err,result); db.close(); }) }) } // 更新數據 exports.updateMany = function(collectionName,json1,json2,callback){ _connectDB(function(err,db){ db.collection(collectionName).updateMany(json1,json2,function(err,result){ callback(err,result); db.close(); }) }) }
// 假設說我不需要分頁,page參數就可以不需要傳遞 exports.find = function(collectionName,json,C,D){ var result = []; if(arguments.length == 3){ //這個時候就是不需要分頁的 var callback = C; var limitnum = 0; var skipnum = 0; }else if(arguments.length == 4){ // 假設傳遞進來c的參數為一個對象{ // pageamount : 10, // page : 0 // } var callback = D; //最后一位就為回調函數 var args = C; //分頁的條件 // 省略的條數 var skipnum = args.pageamount * args.page || 0; // 找到的條數 var limitnum = args.pageamount || 0; // 排序 var sort = args.sort || {}; }else{ throw new Error('find函數參數的個數必須為三個或者四個') return; } _connectDB(function(err,db){ var cursor = db.collection(collectionName).find(json).skip(skipnum).limit(limitnum).sort(sort) cursor.each(function(err,doc){ if(err){ callback(err,null); db.close(); return } if(doc!=null){ result.push(doc); }else{ callback(null,result); db.close() } }) }) }
解讀分頁查詢封裝
collectionName:需要查詢數據的集合名
json :查找條件的對象
C,D: 兩種情況
1. 如果不需要分頁查詢,則D參數不需要,而C參數傳入的是回調
2.需要分頁查詢,則傳入的C,就是查詢分頁的對象,D為回調函數
此時的c應是一個對象的形式傳入,而不是數值
//C對象模板
C = {
pageamount : 10, //跳過的條數
page : 0 //顯示的條數
}
分頁查詢區分
前台假分頁 后台把所有的數據全部從數據庫中獲取過來,然后在原封不動的給前台,前台在根據所有數據來進行分頁。
后台假分頁 后台把所有的數據全部從數據庫中獲取過來,然后根據前端傳遞過來的參數,返回給前端幾條數據。
真的分頁,讓事情給數據庫來做,降低傳輸的內容。