第七章 建議學(xué)習(xí)時(shí)間4小時(shí) 課程共10章
學(xué)習(xí)方式:詳細(xì)閱讀,并手動(dòng)實(shí)現(xiàn)相關(guān)代碼
學(xué)習(xí)目標(biāo):此教程將教會(huì)大家 安裝Node、搭建服務(wù)器、express、mysql、mongodb、編寫后臺(tái)業(yè)務(wù)邏輯、編寫接口,最后完成一個(gè)完整的項(xiàng)目后臺(tái),預(yù)計(jì)共10天課程。
node.js操作mangodb
創(chuàng)建一個(gè)用于放置今天文件的文件夾,npm init初始化一下,并創(chuàng)建demo1.js用于寫node代碼
使用 npm install mongodb,將mongodb控制模塊安裝到本地
在demo1.js中寫入下面操作代碼
1 var mongo = require("mongodb"); //引入mongodb模塊 2 var assert = require("assert"); //引入斷言模塊 3 4 var MongoClient = mongo.MongoClient; //開啟服務(wù) 5 6 var Urls = "mongodb://localhost:27017/demo2"; //url儲(chǔ)存 放在連接池中。 7 8 MongoClient.connect(Urls,function(err,db){ //獲取連接 9 assert.equal(null,err); //使用斷言模塊代替以前的 if判斷10 11 12 //插入數(shù)據(jù)13 db.collection("t1").insert({"name":"xiaoming"},function(err,result){ //連接到數(shù)據(jù)庫上面,并使用參數(shù)傳入集合14 assert.equal(null,err);15 console.log(result);16 db.close();17 });18 19 20 });
代碼解釋:
1行2行引入了需要的兩個(gè)模塊,4行開啟服務(wù)器,
6行是url的地址,一般默認(rèn)安裝的時(shí)候地址和端口是 “mongodb://localhost:27017”,后面的demo2是我的mongodb的數(shù)據(jù)庫的名字(你替換成你自己創(chuàng)建的數(shù)據(jù)庫即可)
8行是根據(jù)上面聲明的url去和數(shù)據(jù)庫建立連接,connect方法有兩個(gè)參數(shù),1、連接的數(shù)據(jù)庫地址,2、回調(diào)函數(shù),回調(diào)函數(shù)兩個(gè)參數(shù)表示發(fā)送錯(cuò)誤,以及正確的情況下返回?cái)?shù)據(jù)庫的鏈接,我們就可以在此鏈接上進(jìn)行操作了。
注意:這里的鏈接是初學(xué)者常報(bào)錯(cuò)的地方,如果報(bào)錯(cuò),去確認(rèn)地址和數(shù)據(jù)庫名字是否填錯(cuò),確保自己的數(shù)據(jù)庫中有對應(yīng)的庫名字。
重點(diǎn)講解下 13行,這里是node插入數(shù)據(jù)庫的操作, db.collection("t1")表示獲取需要操作的表, insert是插入方法,方法接收兩個(gè)參數(shù),1、插入的內(nèi)容,2、回調(diào)函數(shù),回調(diào)函數(shù)兩個(gè)參數(shù)表示發(fā)送錯(cuò)誤,以及正確的情況下返回的結(jié)果。
15行打印出錯(cuò)結(jié)果,16行關(guān)閉和數(shù)據(jù)庫的鏈接(如果一直連著,瀏覽器會(huì)崩潰)
執(zhí)行demo1.js。成功即可得到下圖結(jié)果 ( 劃線處的 n表示成功了1條 )
查詢數(shù)據(jù)庫,可以看到新添加的數(shù)據(jù)
查找: find方法,傳入查找篩選的json(如果不傳,就查詢?nèi)?,后面的toArray是將數(shù)據(jù)作處理之后變成我們可以識(shí)別的數(shù)組格式
后面的操作,除了中部的數(shù)據(jù)操作部分代碼不同,其余代碼都是相同的。
1 var mongo = require("mongodb"); //引入mongodb模塊 2 var assert = require("assert"); //引入斷言模塊 3 4 var MongoClient = mongo.MongoClient; //開啟服務(wù) 5 6 var Urls = "mongodb://localhost:27017/demo2"; //url儲(chǔ)存 放在連接池中。 7 8 MongoClient.connect(Urls,function(err,db){ //獲取連接 9 assert.equal(null,err); //使用斷言模塊代替以前的 if判斷10 11 12 //查找數(shù)據(jù)13 db.collection("t1").find({"name":"xiaoming"}).toArray(function(err,result){14 assert.equal(null,err);15 console.log(result);16 db.close();17 })18 19 20 });
運(yùn)行,成功查找到上一步插入的數(shù)據(jù)
刪除 使用 deleteOne刪除一條數(shù)據(jù),兩個(gè)參數(shù) 1、刪除的查找json 2、回調(diào)函數(shù)
1 var mongo = require("mongodb"); //引入mongodb模塊 2 var assert = require("assert"); //引入斷言模塊 3 4 var MongoClient = mongo.MongoClient; //開啟服務(wù) 5 6 var Urls = "mongodb://localhost:27017/demo2"; //url儲(chǔ)存 放在連接池中。 7 8 MongoClient.connect(Urls,function(err,db){ //獲取連接 9 assert.equal(null,err); //使用斷言模塊代替以前的 if判斷10 11 //刪除數(shù)據(jù)12 db.collection("t1").deleteOne({"name":"xiaoming"},function(err,result){ //連接到數(shù)據(jù)庫上面,并使用參數(shù)傳入集合13 assert.equal(null,err);14 console.log(result);15 db.close();16 });17 18 });
執(zhí)行,成功的結(jié)果
查詢數(shù)據(jù)庫發(fā)現(xiàn) xiaoming那條數(shù)據(jù)被刪除了
修改: 使用 update方法,包括三個(gè)參數(shù),1、查詢條件,2、修改的字段以及修改器,3、回調(diào)函數(shù)
var mongo = require("mongodb"); //引入mongodb模塊var assert = require("assert"); //引入斷言模塊var MongoClient = mongo.MongoClient; //開啟服務(wù)var Urls = "mongodb://localhost:27017/demo2"; //url儲(chǔ)存 放在連接池中。MongoClient.connect(Urls,function(err,db){ //獲取連接 assert.equal(null,err); //使用斷言模塊代替以前的 if判斷 //修改數(shù)據(jù) db.collection("t1").update({"name":"zhangsan1"},{$set:{"name":"xiaoming"}},function(err,result){ //連接到數(shù)據(jù)庫上面,并使用參數(shù)傳入集合 assert.equal(null,err); console.log(result); db.close(); }); });
運(yùn)行成功的結(jié)果
查詢數(shù)據(jù)庫發(fā)現(xiàn),原來的zhangsan1被修改成了xiaoming
到這里,就實(shí)現(xiàn)了通過nodejs增刪改查mongodb數(shù)據(jù)庫
封裝增刪改查的代碼
創(chuàng)建一個(gè)封裝js的文件 dbhandler.js ,將下列代碼復(fù)制進(jìn)去(封裝的代碼文字解說太困難,這里就不解釋了,只給大家介紹如何使用,以后可能會(huì)出視頻教程,到時(shí)候再詳細(xì)解釋這個(gè)封裝)
-- 注:第6行的url后面的數(shù)據(jù)庫 替換成自己要操作的數(shù)據(jù)庫,其他都不用變
var mongo=require("mongodb");//@2.2.11var MongoClient = mongo.MongoClient;var assert = require('assert');var host="localhost";var port="27017";var Urls = 'mongodb://localhost:27017/demo2';//add一條數(shù)據(jù)var add = function(db,collections,selector,fn){ var collection = db.collection(collections); collection.insertMany([selector],function(err,result){ assert.equal(err,null); fn(result); db.close(); }); }//deletevar deletes = function(db,collections,selector,fn){ var collection = db.collection(collections); collection.deleteOne(selector,function(err,result){ try{assert.equal(err,null)}catch(e){ console.log(e); } fn(result); db.close(); }); };//findvar find = function(db,collections,selector,fn){ var collection = db.collection(collections); collection.find(selector).toArray(function(err,docs){ try{ assert.equal(err,null); }catch(e){ console.log(e); docs = []; } fn(docs); db.close(); }); }//(權(quán)限控制) -- 暫時(shí)沒有用MongoClient.connect(Urls, function(err, db) { find(db,"powers",null,function(d){ console.log("123s"); console.log(d.length); }); });//updatevar updates = function(db,collections,selector,fn){ var collection = db.collection(collections); console.log(selector); collection.updateOne(selector[0],selector[1],function(err,result){ assert.equal(err,null); assert.equal(1,result.result.n); fn(result); db.close(); }); }//方法都賦值到操作對象上,便于調(diào)用var methodType = { login:find, show:find, add:add, getpower:find, update:updates, delete:deletes, updatepass:updates, adduser:add, usershow:find, getcategory:find, getcourse:find, find:find, state:find, top:find, AddDirectory:find, updateDirectory:updates, deleteDirectory:deletes, showlist:find, showdir:find };//主邏輯module.exports = function(req,res,collections,selector,fn){ MongoClient.connect(Urls, function(err, db) { assert.equal(null, err); console.log("Connected correctly to server"); methodType[req.query.action](db,collections,selector,fn); db.close(); }); };
使用這個(gè)封裝
具體的封裝的使用方法,我們將在下一節(jié)課項(xiàng)目中去介紹
今天就講到這里,明天我們講解:項(xiàng)目的創(chuàng)建,后臺(tái)數(shù)據(jù)請求接口的編寫
http://www.cnblogs.com/chengduxiaoc/p/7049498.html