node使用Mongoose類(lèi)庫(kù)實(shí)現(xiàn)簡(jiǎn)單的增刪改查
Mongoose是在nodejs環(huán)境中對(duì)MongoDB數(shù)據(jù)庫(kù)操作的封裝,一種對(duì)象模型工具,可以將數(shù)據(jù)庫(kù)中的數(shù)據(jù)轉(zhuǎn)換為javascript對(duì)象供我們使用。
Mongoose安裝
npm install mongoose
安裝成功后,我們就可以使用 require('mongoose')來(lái)使用了;
下面是鏈接本地?cái)?shù)據(jù)庫(kù) mongoosedb,代碼如下:
var mongoose = require('mongoose'); var DB_URL = 'mongodb://localhost:27017/dataDb'; /* 鏈接 */ mongoose.connect(DB_URL); /* 鏈接成功 */ mongoose.connection.on('connected', function() { console.log('Mongoose connection open to ' + DB_URL); }); // 鏈接異常 mongoose.connection.on('error', function(err) { console.log('Mongoose connection error:' + err); }); // 鏈接斷開(kāi) mongoose.connection.on('disconnected', function() { console.log('Mongoose connection disconnected'); });
如下圖所示
從如上代碼,監(jiān)聽(tīng)了幾個(gè)事件,并且執(zhí)行觸發(fā)了connected事件,這表示連接成功。
2. Schema介紹
它是一種以文件形式存儲(chǔ)的數(shù)據(jù)庫(kù)模型骨架,不具備對(duì)數(shù)據(jù)庫(kù)操作的能力,僅僅只是數(shù)據(jù)庫(kù)在程序片段中的一種表現(xiàn),可以理解為表結(jié)構(gòu)。
那么如何去定義一個(gè)Schema呢?請(qǐng)看如下代碼:
var mongoose = require('mongoose'); var TestSchema = new mongoose.Schema({ name: { type: String }, // 屬性name,類(lèi)型為String age: { type: Number, default: 30 }, // 屬性age,類(lèi)型為Number,默認(rèn)值為30 time: { type: Date, default: '當(dāng)前時(shí)間' } });
如上在我們的TestSchema中每個(gè)key在我們的文件將被轉(zhuǎn)換為相關(guān)的SchemaType定義的一個(gè)屬性。允許使用的SchemaTypes有如下類(lèi)型:
- String
- Number
- Date
- Buffer
- Boolean
- Mixed
- ObjectId
- Array
如果我們?cè)谌缟暇帉?xiě)完成后,我們需要添加額外的鍵的話(huà),我們可以使用Schema中的add方法.
3. 創(chuàng)建一個(gè)模型
我們上面定義了Schema,我們需要將我們的TestSchema轉(zhuǎn)成我們可以使用的模型,模型具有對(duì)數(shù)據(jù)庫(kù)操作的能力。
我們可以通過(guò) mongoose.model(modelName, schema);
先來(lái)結(jié)合schema和創(chuàng)建一個(gè)模型來(lái)簡(jiǎn)單的看一個(gè)demo,如下代碼:
var mongoose = require('mongoose'); // schema定義 var TestSchema = new mongoose.Schema({ name: { type: String }, age: { type: String }, sex: { type: String } }); // 創(chuàng)建model var TestModel = mongoose.model('test1', TestSchema); // 初始化數(shù)據(jù) var TestInt = new TestModel({ name: 'kongzhi', age: '30', sex: 'girl' }); console.log(TestInt.name); // kongzhi console.log(TestInt.age); // 30 console.log(TestInt.sex); // girl
下面我們來(lái)簡(jiǎn)單的使用上面定義的內(nèi)容,來(lái)做個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)增刪改查的操作。
1. 在項(xiàng)目中的根目錄下新建一個(gè)db.js, 代碼如下:
var mongoose = require('mongoose'); var DB_URL = 'mongodb://localhost:27017/dataDb'; /* 鏈接 */ mongoose.connect(DB_URL); /* 鏈接成功 */ mongoose.connection.on('connected', function() { console.log('Mongoose connection open to ' + DB_URL); }); // 鏈接異常 mongoose.connection.on('error', function(err) { console.log('Mongoose connection error:' + err); }); // 鏈接斷開(kāi) mongoose.connection.on('disconnected', function() { console.log('Mongoose connection disconnected'); }); module.exports = mongoose;
2. 下面我們新建一個(gè)user的Schema,命名為user.js, 它有如下屬性,如下代碼:
/* 定義一個(gè)user的Schema */ var mongoose = require('./db.js'); var Schema = mongoose.Schema; var UserSchema = new Schema({ username: { type: String }, // 用戶(hù)名 password: { type: String }, // 密碼 age: { type: Number }, // 年齡 }); /* model 是由schema生成的模型,具有對(duì)數(shù)據(jù)庫(kù)操作的能力 */ module.exports = mongoose.model('User', UserSchema);
3. 數(shù)據(jù)庫(kù)操作,我們新建一個(gè)文件叫 app.js
3.1 插入數(shù)據(jù)(Model.save([fn])),代碼如下:
var User = require('./user.js'); // 插入數(shù)據(jù) var user = new User({ username: 'kongzhi0707', password: '123456', age: 30 }); user.save(function(err, res) { if (err) { console.log(err); } else { console.log(res); } });
然后在命令行中運(yùn)行app.js ,可以看到如下:
然后我們?cè)俚奖镜財(cái)?shù)據(jù)庫(kù)中查看數(shù)據(jù),可以看到新增一條數(shù)據(jù),如下圖所示
從數(shù)據(jù)庫(kù)中可以看到插入數(shù)據(jù)成功了;
3.2 更新數(shù)據(jù)(Model.update(conditions, doc, [options], [callback]))
conditions: 更新的條件,該值是一個(gè)對(duì)象。
doc: 需要更新的內(nèi)容,該值也是一個(gè)對(duì)象。
options: 可選參數(shù),它有如下屬性:
safe :(布爾型)安全模式(默認(rèn)為架構(gòu)中設(shè)置的值(true))
upsert :(boolean)如果不匹配,是否創(chuàng)建文檔(false)
multi :(boolean)是否應(yīng)該更新多個(gè)文檔(false)
runValidators:如果為true,則在此命令上運(yùn)行更新驗(yàn)證程序。更新驗(yàn)證器根據(jù)模型的模式驗(yàn)證更新操作。
strict:(布爾)覆蓋strict此更新的選項(xiàng)
overwrite: (布爾)禁用只更新模式,允許您覆蓋文檔(false)
callback: 回調(diào)函數(shù)
如下代碼執(zhí)行更新:
var User = require('./user.js'); // 更新數(shù)據(jù) function update() { // 更新數(shù)據(jù)的條件查詢(xún) var wherestr = {'username': 'kongzhi0707'}; // 執(zhí)行更新數(shù)據(jù) var updatestr = {'password': 'abcdef'}; User.update(wherestr, updatestr, function(err, res) { if (err) { console.log(err); } else { console.log(res); } }); } // 調(diào)用更新函數(shù) update();
運(yùn)行app.js 后,如下圖所示:
繼續(xù)查看數(shù)據(jù)庫(kù),可以看到password字段被更新了,如下圖所示:
3.3 findByIdAndUpdate(id, [update], [options], [callback]);
根據(jù)id進(jìn)行更新;此id就是數(shù)據(jù)庫(kù)中自動(dòng)生成的id;如下代碼,
var User = require('./user.js'); // 更新數(shù)據(jù) function update() { // 更新數(shù)據(jù)的條件查詢(xún) var id = '5b3a4941ca11752732fee772'; // 執(zhí)行更新數(shù)據(jù) var updatestr = {'password': 'vvvvv'}; User.findByIdAndUpdate(id, updatestr, function(err, res) { if (err) { console.log(err); } else { console.log(res); } }); } // 調(diào)用更新函數(shù) update();
如下圖數(shù)據(jù)庫(kù)顯示如下:
3.4 刪除 Model.remove(conditions, [callback])
代碼如下:
var User = require('./user.js'); function del() { // 刪除數(shù)據(jù)的條件 var wherestr = {'username': 'kongzhi0707'}; User.remove(wherestr, function(err, res) { if (err) { console.log(err); } else { console.log(res); } }); } // 調(diào)用函數(shù) del();
到數(shù)據(jù)庫(kù)中查看數(shù)據(jù),可以看到?jīng)]有這條數(shù)據(jù)了;
3.5 條件查詢(xún) Model.find(conditions, [fields], [options], [callback]);
如下代碼所示:
var User = require('./user.js'); function find() { // 刪除數(shù)據(jù)的條件 var wherestr = {'userName': '龍恩0707'}; User.find(wherestr, function(err, res) { if (err) { console.log(err); } else { console.log(res); } }); } // 調(diào)用函數(shù) find();
執(zhí)行后,如下所示:
3.6 數(shù)量查詢(xún) Model.count(conditions, [callback])
var User = require('./user.js'); function getCountByConditions() { User.count({}, function(err, res) { if (err) { console.log(err); } else { console.log(res); // 會(huì)輸出數(shù)據(jù)庫(kù)數(shù)據(jù)的數(shù)量 } }); } // 調(diào)用函數(shù) getCountByConditions();
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 安裝使用Mongoose配合Node.js操作MongoDB的基礎(chǔ)教程
- 詳解Nodejs基于mongoose模塊的增刪改查的操作
- node.js利用mongoose獲取mongodb數(shù)據(jù)的格式化問(wèn)題詳解
- Node.js的MongoDB驅(qū)動(dòng)Mongoose基本使用教程
- 詳解Nodejs mongoose
- Node.js中使用mongoose操作mongodb數(shù)據(jù)庫(kù)的方法
- node.js使用mongoose操作數(shù)據(jù)庫(kù)實(shí)現(xiàn)購(gòu)物車(chē)的增、刪、改、查功能示例
- Node.js+jade+mongodb+mongoose實(shí)現(xiàn)爬蟲(chóng)分離入庫(kù)與生成靜態(tài)文件的方法
- Node Mongoose用法詳解【Mongoose使用、Schema、對(duì)象、model文檔等】
相關(guān)文章
node實(shí)現(xiàn)socket鏈接與GPRS進(jìn)行通信的方法
這篇文章主要介紹了node實(shí)現(xiàn)socket鏈接與GPRS進(jìn)行通信的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05Windows上node.js的多版本管理工具用法實(shí)例分析
這篇文章主要介紹了Windows上node.js的多版本管理工具用法,結(jié)合實(shí)例形式分析了Windows平臺(tái)上node.js多版本管理工具nvm-windows的相關(guān)使用技巧,需要的朋友可以參考下2019-11-11node.js中的fs.readlink方法使用說(shuō)明
這篇文章主要介紹了node.js中的fs.readlink方法使用說(shuō)明,本文介紹了fs.readlink方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-1230分鐘用Node.js構(gòu)建一個(gè)API服務(wù)器的步驟詳解
這篇文章主要介紹了30分鐘用Node.js構(gòu)建一個(gè)API服務(wù)器的步驟詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-05-05node.js中path路徑模塊的使用方法實(shí)例分析
這篇文章主要介紹了node.js中path路徑模塊的使用方法,結(jié)合實(shí)例形式分析了node.js path路徑模塊的基本功能、原理、使用方法及操作注意事項(xiàng),需要的朋友可以參考下2020-02-02一次NodeJS內(nèi)存泄漏排查的實(shí)戰(zhàn)記錄
這篇文章主要給大家介紹了一次NodeJS內(nèi)存泄漏排查的實(shí)戰(zhàn)記錄,文中給出了詳細(xì)的排查過(guò)程以及內(nèi)存泄漏的解決方法,大家可以學(xué)習(xí)一下以備不時(shí)之需,需要的朋友可以參考下2022-03-03nodejs不用electron實(shí)現(xiàn)打開(kāi)文件資源管理器并選擇文件
最近在開(kāi)發(fā)一些小腳本,用 nodejs 實(shí)現(xiàn),其中很多功能需要選擇一個(gè)/多個(gè)文件,或者是選擇一個(gè)文件夾,這種情況下網(wǎng)上給出的解決方案都是 electron,但是我一個(gè)小腳本用 electron 屬實(shí)有點(diǎn)夸張了,后來(lái)轉(zhuǎn)念一想可以通過(guò) powershell 來(lái)實(shí)現(xiàn)類(lèi)似的功能,需要的朋友可以參考下2024-01-01Node.js一行代碼實(shí)現(xiàn)靜態(tài)文件服務(wù)器的方法步驟
這篇文章主要介紹了Node.js一行代碼實(shí)現(xiàn)靜態(tài)文件服務(wù)器的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05