摘要:如圖連接成功后,顯示你的數(shù)據(jù)庫(kù),在這個(gè)節(jié)目可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。如圖安裝與加載首先假定你已經(jīng)安裝了,命令行工具輸入在使用的文件中即可。創(chuàng)建讀取更新刪除單值讀取上文是在中基于對(duì)進(jìn)行增刪查改操作的簡(jiǎn)單介紹,以后會(huì)有進(jìn)階的文章。
關(guān)鍵詞:mongodb安裝 mongoose使用 robomongo mongoose的CRUD操作 mongoose的查詢,增加,修改,刪除
工具介紹MongoDB
MongoDB是基于Javascript語(yǔ)言的數(shù)據(jù)庫(kù),存儲(chǔ)格式是JSON,而Node也是基于JavaScript的環(huán)境(庫(kù)),所以node和mongoDB的搭配能減少因?yàn)閿?shù)據(jù)轉(zhuǎn)換帶來(lái)的時(shí)間空間開銷。
Mongoose
是MongoDB的一個(gè)對(duì)象模型工具,它將數(shù)據(jù)庫(kù)中的數(shù)據(jù)轉(zhuǎn)換為JavaScript對(duì)象以供你在應(yīng)用中使用,封裝了MongoDB對(duì)文檔的的一些增刪改查等常用方法,讓NodeJS操作Mongodb數(shù)據(jù)庫(kù)變得更加靈活簡(jiǎn)單。
Robomongo
一個(gè)可視化的mongoDB操作軟件,類似于mysql的navicat可視化工具。
工具安裝 MongoDB安裝捋一捋它們的關(guān)系,mongoDB是一個(gè)數(shù)據(jù)庫(kù),mongoose是你在自己代碼中操作mongo數(shù)據(jù)庫(kù)的接口,而robomongo是mongo數(shù)據(jù)庫(kù)的可視化工具,通過(guò)它的界面方便直接操作數(shù)據(jù)庫(kù)內(nèi)容。
1.安裝mongoDB
到官網(wǎng)https://www.mongodb.com/download-center#community下載程序安裝,選擇custom模式就行。
2.建立MongoDB環(huán)境
需要自己建立db目錄作為數(shù)據(jù)庫(kù)環(huán)境,在命令行窗口中輸入
$ md datadb
建立db文件夾后,在命令窗口中進(jìn)入安裝目錄的bin文件夾執(zhí)行mongod.exe,把數(shù)據(jù)庫(kù)安裝在datadb中。mongoDB會(huì)檢測(cè)你的根目錄是否有datadb文件夾,如果有會(huì)默認(rèn)安裝到這個(gè)文件夾里面。
$ cd C:Program FilesMongoDBServer3.2in $ mongod.exe
當(dāng)然也可以直接在系統(tǒng)根目錄下創(chuàng)建datadb文件夾,然后在mongoDB安裝文件夾中雙擊執(zhí)行mongod.exe。
3.啟動(dòng)MongoDB
命令行工具中輸入:
$ cd C:Program FilesMongoDBServer3.2in $ mongod.exe
為了避免每次都要輸入目錄,所以在系統(tǒng)變量里面配置一下path變量,把";C:Program FilesMongoDBServer3.2bin"放到path后面(記得加;隔開),以后可以直接在命令行窗口輸入mongod.exe回車即可。
在瀏覽器中輸入網(wǎng)址:http://localhost:27017/ 。如果服務(wù)啟動(dòng)成功會(huì)看到以下一段話:It looks like you are trying to access MongoDB over HTTP on the native driver port.
4.連接MongoDB(這一步基本沒(méi)有用,只有在命令行工具中使用mongo原生方法時(shí)需要,而在mongoose里面會(huì)有連接的代碼,Robomongo運(yùn)行也會(huì)有連接)
命令行工具中輸入mongo.exe,回車。
如果出現(xiàn)這個(gè)警告:2016-07-16T14:49:02.827+0800 I CONTROL [main] Hotfix KB2731284 or later update is not installed, will zero-out data files那是因?yàn)閃indows缺少一個(gè)補(bǔ)丁,從這個(gè)鏈接下周補(bǔ)丁451413_intl_x64_zip,然后解壓安裝包,在你解壓的目錄下找到Windows6.1-KB2731284-v3-x64.mus安裝文件。安裝重啟即可。
Robomongo安裝以及使用直接到官網(wǎng)https://robomongo.org/下載安裝,安裝成功后運(yùn)行,第一次運(yùn)行,需要新創(chuàng)建一個(gè)連接,如圖創(chuàng)建test,點(diǎn)擊save保存連接。
選擇test,點(diǎn)擊connect連接數(shù)據(jù)庫(kù)。robomongo會(huì)自己搜索你系統(tǒng)里面安裝的mongodb并與其連接。如圖
連接成功后,顯示你的數(shù)據(jù)庫(kù),在這個(gè)節(jié)目可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。如圖:
Mongoose安裝與加載首先假定你已經(jīng)安裝了 Node.js,命令行工具輸入:
$ npm install mongoose -g
在使用的文件中require("mongoose");即可。
使用Mongoose進(jìn)行CRUD操作 使用基本步驟Mongose基于mongodb的原生方法,自己定義了一套操作MongoDB數(shù)據(jù)庫(kù)的接口,比原生方法更加簡(jiǎn)單方便。為了更加直觀,下面的步驟結(jié)合例子來(lái)講。假如我需要做一個(gè)教務(wù)系統(tǒng),需要存儲(chǔ)學(xué)生Student的信息,學(xué)生信息通常包含姓名name,學(xué)號(hào)id,電話phone,登錄日期date等。我把學(xué)生的信息存在mongodb的myDB數(shù)據(jù)庫(kù)中,集合的名字叫students。如圖:
_id這個(gè)域你可以自己定義,但如果你沒(méi)有定義,系統(tǒng)會(huì)自動(dòng)給你加上。下面先介紹在node中通過(guò)mongoose對(duì)mongodb進(jìn)行操作的必須前提步驟:
1.node連接數(shù)據(jù)庫(kù)
mongoose.connect("mongodb://user:pass@ip:port/database");
這只是最基本的連接,我們一般還會(huì)加一些設(shè)置,是否開啟調(diào)試模式,連接提示等。通常我會(huì)這么寫:
var mongoose = require("mongoose"); mongoose.Promise = global.Promise; /*調(diào)試模式是mongoose提供的一個(gè)非常實(shí)用的功能,用于查看mongoose模塊對(duì)mongodb操作的日志,一般開發(fā)時(shí)會(huì)打開此功能,以便更好的了解和優(yōu)化對(duì)mongodb的操作。*/ mongoose.set("debug", true); /*一般默認(rèn)沒(méi)有user和password*/ var db=mongoose.connect("mongodb://localhost/myDB"); db.connection.on("error", function (error) { console.log("數(shù)據(jù)庫(kù)連接失敗:" + error); }); db.connection.on("open", function () { console.log("數(shù)據(jù)庫(kù)連接成功"); });
沒(méi)有mongoose.Promise = global.Promise會(huì)出現(xiàn)如下錯(cuò)誤(這個(gè)錯(cuò)誤沒(méi)有什么影響):
意思是mongoose自帶的promise過(guò)期了,然后需要使用v8引擎的promise。
2.定義模式(Schema)
每個(gè)模式映射mongoDB的一個(gè)集合(注意映射這個(gè)詞,下面會(huì)講為什么),它定義(只是定義,不是實(shí)現(xiàn))這個(gè)集合里面文檔的結(jié)構(gòu),就是定義這個(gè)文檔有什么字段,字段類型是什么,字段默認(rèn)值是什么等。除了定義結(jié)構(gòu)外,還定義文檔的實(shí)例方法,靜態(tài)模型方法,復(fù)合索引,中間件等。詳情自己查看mongoose官方文檔。
var mongoose = require("mongoose"); var Schema = mongoose.Schema; /*定義模式Student_Schema*/ var Student_Schema = new Schema({ name: String, id: Number, phone: String, date: Date }, { versionKey: false }); /*定義模型Student,注意數(shù)據(jù)庫(kù)存的是students*/ mongoose.model("Student", Student_Schema);
{versionKey: false}是干嘛用?如果不加這個(gè)設(shè)置,我們通過(guò)mongoose第一次創(chuàng)建某個(gè)集合時(shí),它會(huì)給這個(gè)集合設(shè)定一個(gè)versionKey屬性值,這個(gè)屬性值包含這個(gè)文檔的內(nèi)部版本,數(shù)據(jù)庫(kù)中顯示為_v,如圖:
通過(guò){versionKey: false}可以配置這個(gè)參數(shù),讓數(shù)據(jù)庫(kù)不再添加這個(gè)屬性,格式是:new Schema({..}, { versionKey: false });
3.定義模型(Model)
模型用來(lái)實(shí)現(xiàn)我們定義的模式,調(diào)用mongoose.model來(lái)編譯Schema得到Model。
/*定義模型Student,數(shù)據(jù)庫(kù)存的是students*/ mongoose.model("Student", Student_Schema);
為什么上面我強(qiáng)調(diào)模式的映射,那是因?yàn)槟J絻H僅是和db中集合文檔的結(jié)構(gòu)相對(duì)應(yīng)(映射),它并不直接在數(shù)據(jù)庫(kù)中操作這個(gè)結(jié)構(gòu),模型才是直接與數(shù)據(jù)庫(kù)打交道的存在,可以這么說(shuō):模式是定義結(jié)構(gòu),模型是實(shí)現(xiàn)操作。當(dāng)我們使用mongoose.model("Student", Student_Schema)創(chuàng)建Student模型對(duì)數(shù)據(jù)進(jìn)行操作時(shí),數(shù)據(jù)庫(kù)會(huì)尋找一個(gè)名字叫students集合接受Student模型的操作,特別需要注意的是:1.如果是增加(instance.save)操作時(shí),數(shù)據(jù)庫(kù)中沒(méi)有這個(gè)集合,數(shù)據(jù)庫(kù)會(huì)自動(dòng)創(chuàng)建這個(gè)集合存儲(chǔ)數(shù)據(jù),這個(gè)集合產(chǎn)生規(guī)則為:把Model名字字母全部變小寫和在后面加復(fù)數(shù)s。2.如果是刪改查三個(gè)操作數(shù)據(jù)庫(kù)中沒(méi)有這個(gè)集合,那就是沒(méi)有,刪除空修改空返回空。
4.訪問(wèn)模型
var MyStudent = mongoose.model("Student");
到這里,已經(jīng)基本完成了使用mongoose前提操作了。有沒(méi)有覺(jué)得有點(diǎn)繁瑣,其實(shí)我也覺(jué)得挺繁瑣,幸運(yùn)的是234可以一步創(chuàng)建:
var MyStudent = mongoose.model("Student",{ name: String, id: Number, phone: String, date: Date });
5.創(chuàng)建實(shí)例(instance)
var sam = new MyStudent({ name: "sam976", id: 123, phone: "18706888888", date: Date.now() });
一般只在save(增加)操作中需要。
模型的實(shí)例是集合中真實(shí)的數(shù)據(jù),就是collection中的document,用mysql中的術(shù)語(yǔ)來(lái)說(shuō)就是一條記錄。模型在數(shù)據(jù)庫(kù)中建好了集合和文檔結(jié)構(gòu)后,通過(guò)實(shí)例往里面添加真實(shí)的document。
捋一捋模式、模型、實(shí)例的關(guān)系:模式定義了操作和屬性,這些操作和屬性包括mongoose自帶和自定義,而模型和實(shí)例可以對(duì)模式里面定義的屬性和方法進(jìn)行引用。模型是mongoose用來(lái)和數(shù)據(jù)庫(kù)直接打交道的中介,實(shí)例是往數(shù)據(jù)庫(kù)存的真實(shí)數(shù)據(jù)。模式并非必須,那為什么要分開模式和模型呢?我覺(jué)得是遵循了軟件設(shè)計(jì)中“定義和實(shí)現(xiàn)分開”這個(gè)原則。有的文章說(shuō)模式?jīng)]有操作數(shù)據(jù)庫(kù)的能力,模型才有,對(duì)這個(gè)觀點(diǎn),我覺(jué)得部分對(duì),雖說(shuō)模式不能直接操作數(shù)據(jù)庫(kù),但模式定義的方法可以被模型用來(lái)操作數(shù)據(jù)庫(kù)。官方文檔是這么說(shuō)的:
Schemas not only define the structure of your document and casting of properties, they also define document instance methods, static Model methods, compound indexes and document lifecycle hooks called middleware.
以上是使用mongoose進(jìn)行增刪查改操作都需要經(jīng)過(guò)的前提步驟,下面正式介紹對(duì)數(shù)據(jù)庫(kù)的增刪查改(CRUD)操作。
CRUD操作1.CRUD之create
使用模型創(chuàng)建sam實(shí)例,sam實(shí)例調(diào)用save方法把document存入數(shù)據(jù)庫(kù)的students集合中,代碼如下
var MyStudent = mongoose.model("Student"); var sam = new MyStudent({ name: "sam976", id: 123, phone: "18706888888", date: Date.now() }); sam.save(function(err) {});
通過(guò)robomongo查看數(shù)據(jù)庫(kù),可以看到數(shù)據(jù)已經(jīng)存放成功,如圖
2.CRUD之read
使用MyStudent模型調(diào)用find()方法返回students集合的所有內(nèi)容,第一個(gè)參數(shù)定義條件,第二個(gè)參數(shù)是回調(diào)函數(shù),回調(diào)函數(shù)中的docs是返回的是查找結(jié)果,結(jié)果形式為一個(gè)json數(shù)據(jù)數(shù)組[{},{}]。
var MyStudent = mongoose.model("Student"); MyStudent.find({}, function(err, docs) {});
比如數(shù)據(jù)庫(kù)students集合中,有如下數(shù)據(jù):
運(yùn)行上面代碼,結(jié)果console.log輸出顯示如下:
模型還可以調(diào)用其他很多查詢的函數(shù),比如
Model.findById(id, [projection], [options], [callback]); Model.findOne([conditions], [projection], [options], [callback]);
篇幅較多,這里不攤開來(lái)講(以后會(huì)專門出一篇介紹),可以自己查看官方文檔關(guān)于Querying介紹
3.CRUD之update
使用MyStudent模型調(diào)用update()方法完成更新,第一個(gè)參數(shù)是條件(也就是where name="sam976"),第二個(gè)參數(shù)修改的內(nèi)容。
var MyStudent = mongoose.model("Student"); MyStudent.update({name:"sam976"},{id:456,phone:"12345678910"}, function(error){});
運(yùn)行如上代碼前,如圖
運(yùn)行如上代碼后,如圖
4.CRUD之delete
使用MyStudent模型調(diào)用remove()方法刪除文檔。
var MyStudent = mongoose.model("Student"); MyStudent.remove({ name: "sam976" }, function (err) {});源碼結(jié)構(gòu)
使用mongoose的時(shí)候,通常會(huì)在項(xiàng)目中創(chuàng)建三個(gè)文件:connect.js,mongoose-db.js,app.js。
其中connect.js存放的是連接數(shù)據(jù)庫(kù)的操作,我們只需要加載一次即可在程序運(yùn)行期間一直連接數(shù)據(jù)庫(kù)。
mongoose-db.js文件存放模式和模型的生成的代碼,沒(méi)有連接信息,也沒(méi)有其他額外不相干代碼,可以在在mongoose-db.js中把模型exports公開:
var MyStudent = mongoose.model("Student", Student_Schema); exports.MyStudent=MyStudent; /*定義其他模型和模式*/ var MyTeacher = mongoose.model("Teacher", Teacher_Schema); exports.MyTeacher=MyTeacher;
然后在app.js中引用:
var MyStudent = require("./mongoose-db").MyStudent; var MyTeacher = require("./mongoose-db").MyTeacher;
app.js存放對(duì)數(shù)據(jù)庫(kù)的操作,比如CRUD。通過(guò)這樣的方式,結(jié)構(gòu)比較清晰,代碼可讀性大大增強(qiáng)。
下面放源碼(目的是給自己備份,笑臉...)
connect.js
var mongoose = require("mongoose"); mongoose.Promise = global.Promise;//為了解決過(guò)期的問(wèn)題 /*調(diào)試模式是mongoose提供的一個(gè)非常實(shí)用的功能,用于查看mongoose模塊對(duì)mongodb操作的日志,一般開發(fā)時(shí)會(huì)打開此功能,以便更好的了解和優(yōu)化對(duì)mongodb的操作。*/ mongoose.set("debug", true); /*mongoose會(huì)緩存命令,只要connect成功,處于其前其后的命令都會(huì)被執(zhí)行,connect命令也就無(wú)所謂放哪里*/ var db=mongoose.connect("mongodb://localhost/myDB"); db.connection.on("error", function (error) { console.log("數(shù)據(jù)庫(kù)連接失敗:" + error); }); db.connection.on("open", function () { console.log("數(shù)據(jù)庫(kù)連接成功");
mongoose-db.js
require("./connect"); var mongoose = require("mongoose"); var Schema = mongoose.Schema; /*定義模式Student_Schema*/ var Student_Schema = new Schema({ name: String, id: Number, phone: String, date: Date }, { versionKey: false }); /*定義模型Student,數(shù)據(jù)庫(kù)存的是students*/ var MyStudent = mongoose.model("Student", Student_Schema); exports.MyStudent=MyStudent; /*mongoose.Schema({ username: {// 真實(shí)姓名 type: String, required: true }, password: { // 密碼 type: String, required: true } });*/
app.js
require("./mongoose-db"); var express = require("express"); var mongoose = require("mongoose"); var MyStudent = require("./mongoose-db").MyStudent; var app = express(); app.use(express.static("./")); app.get("/create", function(req, res) { console.log("create 函數(shù)") var beta = new MyStudent({ name: "beta", id: 124, phone: "1871111111", date: Date.now() }); beta.save(function(err) { if (err) { console.log(err); } else { console.log("存入成功"); } }); res.send("存入成功!!"); }); app.get("/read", function(req, res) { console.log("讀取函數(shù)"); MyStudent.find({}, function(err, docs) { console.log(docs); /*對(duì)docs進(jìn)行操作*/ }); res.send("讀取成功!!"); }); app.get("/readOne", function(req, res) { console.log("讀取單值函數(shù)"); MyStudent.findOne({ name: req.query.student_name }, { "id": 1, "_id": 0 }, function(err, docs) { if (docs.id === req.query.student_id) { res.send("登錄成功"); console.log(docs.password); } else { console.log(docs.password); res.send("登錄失敗"); } }); /*過(guò)濾查詢,參數(shù)2: {"name":1, "password":0} 查詢文檔的返回結(jié)果包含name , 不包含password.(_id默認(rèn)是1)*/ /*model.find({},null,{limit:20});過(guò)濾查詢,參數(shù)3: 游標(biāo)操作 limit限制返回結(jié)果數(shù)量為20個(gè),如不足20個(gè)則返回所有*/ }); app.get("/update", function(req, res) { console.log("更新函數(shù)"); MyStudent.update({ name: "sam976" }, { id: 456, phone: "12345678910" }, function(error) {}); res.send("更新成功!!"); }); app.get("/delete", function(req, res) { console.log("刪除函數(shù)"); MyStudent.remove({ name: "sam976" }, function(err) { if (err) return handleError(err); // removed! }); res.send("刪除成功!!"); }); app.listen(3001, function() { console.log("start server") });
為了測(cè)試,我還寫了個(gè)html。data-operate.html
data-operate
上文是在Node中基于Mongoose對(duì)MongoDB進(jìn)行增刪查改(CRUD)操作的簡(jiǎn)單介紹,以后會(huì)有進(jìn)階的文章。
參考文獻(xiàn):
Node.js 手冊(cè)查詢-3-Mongoose 方法
Mongoose Schemas v4.5.8
mongoose入門
CSDN個(gè)人博客地址--點(diǎn)擊這里
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/18866.html
摘要:如圖連接成功后,顯示你的數(shù)據(jù)庫(kù),在這個(gè)節(jié)目可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。如圖安裝與加載首先假定你已經(jīng)安裝了,命令行工具輸入在使用的文件中即可。創(chuàng)建讀取更新刪除單值讀取上文是在中基于對(duì)進(jìn)行增刪查改操作的簡(jiǎn)單介紹,以后會(huì)有進(jìn)階的文章。 關(guān)鍵詞:mongodb安裝 mongoose使用 robomongo mongoose的CRUD操作 mongoose的查詢,增加,修改,刪除 工具介紹 Mon...
摘要:通過(guò)構(gòu)造而成,除了具有定義的數(shù)據(jù)庫(kù)骨架以外,還可以具體的操作數(shù)據(jù)庫(kù)。通過(guò)創(chuàng)建的實(shí)體,它也可以操作數(shù)據(jù)庫(kù)。但比更具操作性。 原文鏈接:Mongoose 前言 學(xué)數(shù)據(jù)庫(kù)肯定需要知道怎么連接后臺(tái)Mongoose 是用來(lái)方便連接 MongoDB 與 node 的一個(gè)工具包是時(shí)候?qū)W習(xí)一波 nodejs連接MongoDB 連接數(shù)據(jù)庫(kù)前需要先打開數(shù)據(jù)庫(kù) MongoDB yarn add mongoo...
摘要:查詢條件控制返回的字段控制選項(xiàng)回調(diào)函數(shù)。改查詢條件需要修改的數(shù)據(jù),不能修改主鍵控制選項(xiàng)回調(diào)函數(shù),返回的是受影響的行數(shù)。執(zhí)行查詢,回調(diào)函數(shù)。使用鏈?zhǔn)秸Z(yǔ)句時(shí),可以在之后接執(zhí)行查詢,并指定回調(diào)函數(shù)。 初學(xué)Node.js接觸到MongoDB數(shù)據(jù)庫(kù),閱讀資料中推薦的都是Mongoose模塊,可以更加方便的對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,便開始接觸Mongoose。在學(xué)習(xí)時(shí)碰到許多基礎(chǔ)問(wèn)題,查閱了許多資料理來(lái)理...
摘要:前言學(xué)習(xí)前端也有一段時(shí)間了做個(gè)個(gè)人博客網(wǎng)站吧正好總結(jié)練習(xí)一下這段時(shí)間的所學(xué)文章很長(zhǎng),會(huì)拆成三篇來(lái)講項(xiàng)目地址效果后臺(tái)管理系統(tǒng)前端頁(yè)面架構(gòu)可以看到,在整個(gè)項(xiàng)目中,沒(méi)有頁(yè)面的跳轉(zhuǎn)只有前后端的數(shù)據(jù)交換,所有的頁(yè)面更新都是組件更新和數(shù)據(jù)更新后端只對(duì)數(shù) 前言 學(xué)習(xí)前端也有一段時(shí)間了做個(gè)個(gè)人博客網(wǎng)站吧正好總結(jié)練習(xí)一下這段時(shí)間的所學(xué)文章很長(zhǎng),會(huì)拆成三篇來(lái)講 項(xiàng)目github地址:https://git...
摘要:前言學(xué)習(xí)前端也有一段時(shí)間了做個(gè)個(gè)人博客網(wǎng)站吧正好總結(jié)練習(xí)一下這段時(shí)間的所學(xué)文章很長(zhǎng),會(huì)拆成三篇來(lái)講項(xiàng)目地址效果后臺(tái)管理系統(tǒng)前端頁(yè)面架構(gòu)可以看到,在整個(gè)項(xiàng)目中,沒(méi)有頁(yè)面的跳轉(zhuǎn)只有前后端的數(shù)據(jù)交換,所有的頁(yè)面更新都是組件更新和數(shù)據(jù)更新后端只對(duì)數(shù) 前言 學(xué)習(xí)前端也有一段時(shí)間了做個(gè)個(gè)人博客網(wǎng)站吧正好總結(jié)練習(xí)一下這段時(shí)間的所學(xué)文章很長(zhǎng),會(huì)拆成三篇來(lái)講 項(xiàng)目github地址:https://git...
閱讀 1867·2019-08-29 16:44
閱讀 2172·2019-08-29 16:30
閱讀 780·2019-08-29 15:12
閱讀 3531·2019-08-26 10:48
閱讀 2659·2019-08-23 18:33
閱讀 3780·2019-08-23 17:01
閱讀 1943·2019-08-23 15:54
閱讀 1302·2019-08-23 15:05