Node.js數(shù)據(jù)庫開發(fā)實戰(zhàn)之mongodb
一、創(chuàng)建項目
(1)使用WebStorm創(chuàng)建node-mongodb項目
(2)創(chuàng)建完成后,項目會自動打開,如下圖
說明:后續(xù)兩種連接mongodb的例子均基于此項目。
二、使用mongoose連接mongodb
mongoose是一個基于node-mongodb-native開發(fā)的mongodb的Node.js驅(qū)動,可以很方便地在異步環(huán)境中使用。
1、安裝mongoose
在WebStorm的Terminal中使用npm安裝mongoose:
npm install mongoose
安裝完成如下圖:
2、連接數(shù)據(jù)庫
mongoose模塊通過connect()方法與mongodb創(chuàng)建連接。connect()方法中需要傳遞一個URI地址,用來說明需要連接的mongodb數(shù)據(jù)庫。如下代碼就和服務器172.16.2.103的mongodb數(shù)據(jù)庫node_test建立了連接。
測試代碼:
//引入mongoose模塊 const mongoose = require('mongoose'); //定義mongodb地址 const uri = 'mongodb://root:123456@172.16.2.103:27017/node_test?authSource=admin'; //連接mongodb mongoose.connect(uri, function (err) { if (err) { console.log('連接失敗'); console.log(err); return; } console.log('連接成功'); } );
測試結(jié)果:
代碼說明:
connect()方法創(chuàng)建mongodb連接,回調(diào)函數(shù)中err為參數(shù),出現(xiàn)連接錯誤則打印出“連接失敗”,連接成功則打印出“連接成功”。運行這段代碼,如果mongodb服務已經(jīng)正常開啟,就會在控制臺打印出“連接成功”字樣。
需要說明的是,connect()方法中uri參數(shù)的完整示例應該是:
mongodb://user:pass@host:port/database user:代表mongodb的用戶名 pass:代表用戶名對應的密碼 host:代表mongodb服務的IP地址 port:代表mongodb服務的端口號 database:代表對應的數(shù)據(jù)庫名 ?authSource=admin:用于做授權(quán)驗證的數(shù)據(jù)庫,如果不加,后續(xù)保存數(shù)據(jù)會報錯
3、保存數(shù)據(jù)
mongoose中的一切由schema開始。schema是一種以文件形式存儲的數(shù)據(jù)庫模型骨架,并不具備數(shù)據(jù)庫的操作能力。schema中定義了model中的所有屬性,而model則是對應一個mongodb中的collection。以下代碼定義了一個schema并且注冊成了一個model:
測試代碼:
//引入mongoose模塊 const mongoose = require('mongoose'); //定義mongodb地址 const uri = 'mongodb://root:123456@172.16.2.103:27017/node_test?authSource=admin'; //連接mongodb mongoose.connect(uri, function (err) { if (err) { console.log('連接失敗'); console.log(err); return; } console.log('連接成功'); } ); /** * 定義UserSchema * @type {mongoose.Schema} */ const UserSchema = new mongoose.Schema({ name: String, age: Number, sex: String, birth: Date }); mongoose.model('User', UserSchema);
這段代碼通過實例化一個mongoose.Schema()對象定義一個model的所有屬性,類似于關(guān)系型數(shù)據(jù)庫中的字段和字段的數(shù)據(jù)類型。schema合法的類型有String、Number、Date、Buffer、Boolean、Mixed、Objectid和Array。mongoose中通過mongoose.model()方法注冊一個model。在mongoose中可以調(diào)用save()方法將一個新的文檔插入到已有的collection中,代碼如下:
//引入mongoose模塊 const mongoose = require('mongoose'); //定義mongodb地址 const uri = 'mongodb://root:123456@172.16.2.103:27017/node_test?authSource=admin'; //連接mongodb mongoose.connect(uri, function (err) { if (err) { console.log('連接失敗'); console.log(err); return; } console.log('連接成功'); } ); /** * 定義UserSchema * @type {mongoose.Schema} */ const UserSchema = new mongoose.Schema({ name: String, age: Number, sex: String, birth: Date }); mongoose.model('User', UserSchema); const User = mongoose.model('User'); const user = new User({ name: '張三', age: 25, sex: '男', birth: new Date() }); /** * 將文檔插入到集合中 */ user.save(function (err) { if (err) { console.log('保存失敗'); console.log(err); } else { console.log('保存成功'); } });
測試結(jié)果:
提示保存成功,查看數(shù)據(jù)庫,可以看到數(shù)據(jù)庫自動創(chuàng)建了users集合,并且數(shù)據(jù)已經(jīng)保存了:
代碼說明:
這段代碼調(diào)用名為User的model,之后定義了一個User的文檔,最后使用save將記錄插入到相應的collection中。save()方法中的回調(diào)函數(shù)監(jiān)聽是否出錯。運行這段代碼,在mongodb運行正常的情況下,控制臺將輸出“保存成功”字樣。
4、查詢數(shù)據(jù)集
使用mongoose可以查詢mongodb相應的數(shù)據(jù)。如下代碼可以將users這個collection中的所有文檔查詢出來:
測試代碼1:
//引入mongoose模塊 const mongoose = require('mongoose'); //定義mongodb地址 const uri = 'mongodb://root:123456@172.16.2.103:27017/node_test?authSource=admin'; //連接mongodb mongoose.connect(uri, function (err) { if (err) { console.log('連接失敗'); console.log(err); return; } console.log('連接成功'); } ); /** * 定義UserSchema * @type {mongoose.Schema} */ const UserSchema = new mongoose.Schema({ name: String, age: Number, sex: String, birth: Date }); mongoose.model('User', UserSchema); const User = mongoose.model('User'); /** * 查詢mongodb */ User.find({}, function (err, docs) { if (err) { console.log('查詢失敗'); return; } console.log("查詢結(jié)果:" + docs); });
測試結(jié)果1:
代碼說明1:
這段代碼通過find()方法查找相應的數(shù)據(jù)記錄。find()方法中的第一個參數(shù)是一個json對象,定義查找的條件,第二個參數(shù)為回調(diào)函數(shù)。回調(diào)函數(shù)中的第一個參數(shù)是error,第二個參數(shù)是查詢的結(jié)果。在find()方法中的第一個參數(shù)中可以傳入篩選條件,以便更加精確地查找出需要查找的數(shù)據(jù)。現(xiàn)將find()方法的代碼修改為以下代碼:
測試代碼2:
User.find({name: '張三'}, function (err, docs) { if (err) { console.log('查詢失敗'); return; } console.log("查詢結(jié)果:" + docs); });
運行這段代碼只查詢出name是”張三“的數(shù)據(jù):
5、查詢并修改數(shù)據(jù)
在mongoose中可以直接在查詢記錄后修改記錄的值,修改后直接調(diào)用保存以保存修改后的數(shù)據(jù)。如下代碼查詢數(shù)據(jù)后直接修改數(shù)據(jù)的name值為“李四”。
測試代碼:
//引入mongoose模塊 const mongoose = require('mongoose'); //定義mongodb地址 const uri = 'mongodb://root:123456@172.16.2.103:27017/node_test?authSource=admin'; //連接mongodb mongoose.connect(uri, function (err) { if (err) { console.log('連接失敗'); console.log(err); return; } console.log('連接成功'); } ); /** * 定義UserSchema * @type {mongoose.Schema} */ const UserSchema = new mongoose.Schema({ name: String, age: Number, sex: String, birth: Date }); mongoose.model('User', UserSchema); const User = mongoose.model('User'); /** * 查詢mongodb */ User.find({name: '張三'}, function (err, docs) { if (err) { console.log('查詢失敗'); return; } // 修改數(shù)據(jù) docs[0].name = '李四'; //保存修改后的數(shù)據(jù) docs[0].save(); console.log("查詢結(jié)果:" + docs); });
測試結(jié)果:
通過Navicat查看數(shù)據(jù)庫,數(shù)據(jù)已經(jīng)更新:
6、刪除數(shù)據(jù)
類似于修改數(shù)據(jù),刪除mongodb的文檔也可以在查詢出文檔后直接調(diào)用remove方法。如下代碼可以刪除users集合中的所有文檔:
測試代碼:
//引入mongoose模塊 const mongoose = require('mongoose'); //定義mongodb地址 const uri = 'mongodb://root:123456@172.16.2.103:27017/node_test?authSource=admin'; //連接mongodb mongoose.connect(uri, function (err) { if (err) { console.log('連接失敗'); console.log(err); return; } console.log('連接成功'); } ); /** * 定義UserSchema * @type {mongoose.Schema} */ const UserSchema = new mongoose.Schema({ name: String, age: Number, sex: String, birth: Date }); mongoose.model('User', UserSchema); const User = mongoose.model('User'); /** * 查詢mongodb */ User.find({}, function (err, docs) { if (err) { console.log('查詢失敗'); return; } if (docs) { //刪除數(shù)據(jù) docs.forEach(function (item) { item.remove(); }); console.log('刪除成功'); } });
測試結(jié)果:
通過Navicat查看數(shù)據(jù)庫,數(shù)據(jù)已經(jīng)刪除:
代碼說明:
只有單個文檔可以調(diào)用remove()方法,因為find()方法返回的是一個符合查詢條件的所有文檔組成的數(shù)組,所以這里調(diào)用數(shù)組的forEach()方法逐個刪除所有的文檔。
三、直接連接mongodb
二中提到了mongoose模塊是基于node-mongodb-native開發(fā)的mongodb的Node.js驅(qū)動,同樣使用node-mongodb-native這個原生mongodb驅(qū)動也可以對mongodb進行相應的操作。
1、安裝mongodb
使用node-mongodb-native這個模塊前需要安裝mongodb模塊,在WebStorm的Terminal中使用npm安裝mongodb:
npm install mongodb
安裝完成如下圖:
2、連接數(shù)據(jù)庫
node-mongodb-native通過connect()方法傳遞一個URI地址,用來說明需要連接的mongodb數(shù)據(jù)庫。如下代碼即和服務器172.16.2.103的mongodb數(shù)據(jù)庫node_test建立了連接。
測試代碼:
//引入模塊 const MongoClient = require('mongodb').MongoClient; //定義mongodb地址 const uri = 'mongodb://root:123456@172.16.2.103:27017/node_test?authSource=admin'; //連接mongodb MongoClient.connect(uri, function (err, db) { if (err) { console.log('連接失敗'); console.log(err); return; } console.log('連接成功'); } );
測試結(jié)果:
代碼說明:
因為mongoose是基于node-mongodb-native開發(fā)的,所以兩者的API還是有相似的地方。運行以上這段代碼,如果mongodb運行正常,將會打印出“連接成功”字樣。
3、保存數(shù)據(jù)
使用node-mongodb-native驅(qū)動需要注意:每次操作完mongodb都應該調(diào)用close方法來關(guān)閉mongodb,否則會影響其他代碼對mongodb的操作。調(diào)用insertOne方法可以插入一條數(shù)據(jù),如前面提到的一樣,node-mongodb-native插入的數(shù)據(jù)依舊是json格式,代碼如下:
測試代碼:
//引入模塊 const MongoClient = require('mongodb').MongoClient; //定義mongodb地址 const uri = 'mongodb://root:123456@172.16.2.103:27017/node_test?authSource=admin'; //連接mongodb MongoClient.connect(uri, function (err, db) { if (err) { console.log('連接失敗'); console.log(err); return; } console.log('連接成功'); /** * 定義數(shù)據(jù) */ const user = { name: '張三', age: 30, sex: '男', birth: new Date() } const dbase = db.db('node_test'); //打開集合 dbase.collection('users').insertOne(user, function (err, doc) { //關(guān)閉數(shù)據(jù)庫 db.close(); if (err) { console.log('執(zhí)行失敗'); console.log(err); return; } console.log('數(shù)據(jù)添加成功'); }); } );
測試結(jié)果:
通過Navicat查看數(shù)據(jù)庫,數(shù)據(jù)已經(jīng)被添加:
代碼說明:
這段代碼將一個名為“張三”的用戶數(shù)據(jù)插入到node_test數(shù)據(jù)庫下的users集合中,整個過程是連接數(shù)據(jù)庫→打開集合→插入數(shù)據(jù)→關(guān)閉數(shù)據(jù)庫。如果想保存多條數(shù)據(jù),可以使用insertMany(),第一個參數(shù)傳入一個Json數(shù)組即可。
4、查詢數(shù)據(jù)
使用mongoose可以查詢mongodb相應的數(shù)據(jù)。如下代碼可以將users這個collection中的所有文檔查詢出來:
測試代碼1:
//引入模塊 const MongoClient = require('mongodb').MongoClient; //定義mongodb地址 const uri = 'mongodb://root:123456@172.16.2.103:27017/node_test?authSource=admin'; //連接mongodb MongoClient.connect(uri, function (err, db) { if (err) { console.log('連接失敗'); console.log(err); return; } console.log('連接成功'); const dbase = db.db('node_test'); //打開集合 dbase.collection('users').find({}).toArray(function (err, result) { //關(guān)閉數(shù)據(jù)庫 db.close(); if (err) { console.log('查詢失敗'); console.log(err); return; } console.log(result); }); } );
測試結(jié)果1:
代碼說明1:
整個過程也是按照連接數(shù)據(jù)庫→打開集合→查詢數(shù)據(jù)→關(guān)閉數(shù)據(jù)庫這個流程嚴格執(zhí)行的。在find()方法中的參數(shù)中可以傳入Json格式的篩選條件,以便更加精確地查找出需要查找的數(shù)據(jù)。現(xiàn)將find()方法的代碼修改為以下代碼:
測試代碼2:
//引入模塊 const MongoClient = require('mongodb').MongoClient; //定義mongodb地址 const uri = 'mongodb://root:123456@172.16.2.103:27017/node_test?authSource=admin'; //連接mongodb MongoClient.connect(uri, function (err, db) { if (err) { console.log('連接失敗'); console.log(err); return; } console.log('連接成功'); const dbase = db.db('node_test'); //打開集合 dbase.collection('users').find({name: '李四'}).toArray(function (err, result) { //關(guān)閉數(shù)據(jù)庫 db.close(); if (err) { console.log('查詢失敗'); console.log(err); return; } console.log(result); }); } );
運行這段代碼同樣只查詢出name為“李四“的數(shù)據(jù):
5、修改數(shù)據(jù)
node-mongodb-native模塊的updateOne()方法可以更改數(shù)據(jù),與查詢方法類似。updateOne()方法的第一個參數(shù)是查詢條件,第二個參數(shù)是更改后的數(shù)據(jù),第三個參數(shù)是一個處理錯誤和結(jié)果的回調(diào)函數(shù)。如下代碼就可以將“李四”這條數(shù)據(jù)的年齡改為32。
測試代碼:
//引入模塊 const MongoClient = require('mongodb').MongoClient; //定義mongodb地址 const uri = 'mongodb://root:123456@172.16.2.103:27017/node_test?authSource=admin'; //連接mongodb MongoClient.connect(uri, function (err, db) { if (err) { console.log('連接失敗'); console.log(err); return; } console.log('連接成功'); const dbase = db.db('node_test'); // 更新條件 const whereStr = {name: '李四'}; // 更新的數(shù)據(jù) const updateStr = {$set: {age: 32}}; //打開集合 dbase.collection('users').updateOne(whereStr, updateStr, function (err, res) { //關(guān)閉數(shù)據(jù)庫 db.close(); if (err) { console.log('查詢失敗'); console.log(err); return; } console.log('文檔更新成功'); }); });
測試結(jié)果:
通過Navicat查看數(shù)據(jù)庫,數(shù)據(jù)已經(jīng)更新:
代碼說明:
如果要更新所有符合條的文檔數(shù)據(jù)可以使用 updateMany()。
6、刪除數(shù)據(jù)
類似于修改數(shù)據(jù),刪除mongodb的文檔也可以在查詢出文檔后直接調(diào)用remove方法。如下代碼可以刪除users集合中的所有文檔:
測試代碼:
//引入模塊 const MongoClient = require('mongodb').MongoClient; //定義mongodb地址 const uri = 'mongodb://root:123456@172.16.2.103:27017/node_test?authSource=admin'; //連接mongodb MongoClient.connect(uri, function (err, db) { if (err) { console.log('連接失敗'); console.log(err); return; } console.log('連接成功'); const dbase = db.db('node_test'); // 刪除條件 const whereStr = {name: '李四'}; //打開集合 dbase.collection('users').deleteOne(whereStr, function (err, obj) { //關(guān)閉數(shù)據(jù)庫 db.close(); if (err) { console.log('刪除失敗'); console.log(err); return; } console.log('文檔刪除成功'); }); });
測試結(jié)果:
通過Navicat查看數(shù)據(jù)庫,數(shù)據(jù)已經(jīng)刪除:
代碼說明:
如果要刪除多條語句可以使用 deleteMany() 方法。
JavaScript MongoDB 數(shù)據(jù)庫
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。