Node.js數(shù)據(jù)庫開發(fā)實戰(zhàn)之mongodb

      網(wǎng)友投稿 824 2022-05-29

      一、創(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。

      Node.js數(shù)據(jù)庫開發(fā)實戰(zhàn)之mongodb

      測試代碼:

      //引入模塊 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)容。

      上一篇:一站式接口文檔及測試工具yapi介紹
      下一篇:【軟通鯤鵬云最佳實踐26】openldap-2.4.8 鯤鵬云服務器安裝實踐
      相關(guān)文章
      亚洲福利电影在线观看| 337p欧洲亚洲大胆艺术| 亚洲综合久久久久久中文字幕| 亚洲精品制服丝袜四区| 亚洲日韩国产一区二区三区| 久久无码av亚洲精品色午夜| 在线精品自拍亚洲第一区| 亚洲精品乱码久久久久蜜桃| 亚洲国产欧美一区二区三区| 亚洲成aⅴ人片久青草影院按摩| 亚洲午夜无码久久久久软件| 中文字幕在线日亚洲9| 亚洲天然素人无码专区| 亚洲熟妇少妇任你躁在线观看| 亚洲中文字幕无码久久2020| 91在线亚洲综合在线| 在线亚洲午夜片AV大片| 亚洲欧美国产日韩av野草社区| 亚洲精品无码你懂的| 狠狠入ady亚洲精品| mm1313亚洲精品无码又大又粗| 亚洲AV无码AV吞精久久| 亚洲国产成人无码AV在线| 亚洲第一男人天堂| 亚洲午夜无码久久久久小说| 亚洲人av高清无码| 国产精品亚洲一区二区无码| 久久精品国产亚洲Aⅴ蜜臀色欲| 亚洲色婷婷综合久久| 黑人精品videos亚洲人| 亚洲av无码av制服另类专区| 亚洲高清日韩精品第一区| 亚洲人成黄网在线观看| 成人区精品一区二区不卡亚洲| 久久精品国产亚洲AV天海翼| 国产精品亚洲产品一区二区三区| 亚洲AⅤ永久无码精品AA| 另类专区另类专区亚洲| 国产偷国产偷亚洲清高动态图| 精品亚洲一区二区| 亚洲视频免费一区|