一、準(zhǔn)備工作
1. 啟動(dòng)mongo數(shù)據(jù)庫(kù)
mongod
2. 新建數(shù)據(jù)庫(kù)
cmd + n
新建終端窗口
// 使用終端操作數(shù)據(jù)庫(kù)
mongo
// 創(chuàng)建mongoosetest數(shù)據(jù)庫(kù)
use mongoosetest
二癌刽、利用mongoose進(jìn)行簡(jiǎn)單的數(shù)據(jù)庫(kù)操作
1. 新建項(xiàng)目
- 新建空文件夾,命名為
mongooseTest
cd - 啟動(dòng)終端,進(jìn)入該文件夾
- 在命令行中輸入
npm init
初始化項(xiàng)目
npm init
- 下載依賴包
cnpm i mongoose -s
2. 連接數(shù)據(jù)庫(kù)
在根目錄下創(chuàng)建 db.js
物臂,輸入以下代碼壮啊,監(jiān)聽(tīng) connection
的幾個(gè)事件嫉鲸,如果以上操作都沒(méi)錯(cuò)的話,那么就會(huì)監(jiān)聽(tīng)第一個(gè)事件 connect
事件歹啼,表示連接數(shù)據(jù)庫(kù)成功玄渗,在最后,我們導(dǎo)出 mongoose對(duì)象
狸眼,以供其他模塊使用藤树。
const mongoose = require('mongoose');
//設(shè)置mongo存儲(chǔ)路徑
const dbUrl = 'mongodb://localhost:27017/mongoosetest';
mongoose.connect(dbUrl, {useMongoClient: true})
// 連接成功
mongoose.connection.on('connected', () => {
console.log('MongoDB connected success.')
})
// 連接異常
mongoose.connection.on('error', () => {
console.log('MongoDB connected error.')
})
// 連接斷開(kāi)
mongoose.connection.on('disconnected', () => {
console.log('MongoDB connected disconnected.')
})
//導(dǎo)出mongoose對(duì)象
module.exports = mongoose
運(yùn)行db.js,如下圖所示:
3. 新建Schema與發(fā)布Model
那么什么是 Schema
呢拓萌? schema
是 mongoose
里會(huì)用到的一種數(shù)據(jù)模式岁钓,可以理解為我們傳統(tǒng)數(shù)據(jù)庫(kù)中的表(table)結(jié)構(gòu)的定義,簡(jiǎn)單地說(shuō)微王,就是一個(gè)數(shù)據(jù)模板屡限,每個(gè) schema
會(huì)映射到 mongodb
中的一個(gè)
collection
,它不具備操作數(shù)據(jù)庫(kù)的能力炕倘。
那什么又是 Model
呢钧大? Model
是由 Schema
發(fā)布生成的模型,具有抽象屬性和行為的數(shù)據(jù)庫(kù)操作對(duì)罩旋,
Model
可以直接操作 Mongo
數(shù)據(jù)庫(kù)中的數(shù)據(jù)修械。
解釋完了代碼用說(shuō)話,新建 user.js
愧哟,輸入以下代碼似谁,創(chuàng)建一個(gè) user
的 schema
,并且利用 Schema
發(fā)布一個(gè) Model
东帅,導(dǎo)出 Model
:
// 引入之前我們創(chuàng)建的mongose對(duì)象
const mongoose = require('./db')
// 創(chuàng)建一個(gè)schema對(duì)象
const Schema = mongoose.Schema
// 創(chuàng)建一個(gè)schema實(shí)例
let UserSchema = new Schema({
username: {type: String},
userpwd: {type: String},
userage: {type: Number},
logindate: {type: Date}
})
// 利用UserSchema實(shí)例,發(fā)布一個(gè)User的model并且導(dǎo)出
module.exports = mongoose.model('User',UserSchema)
4. Model創(chuàng)造Entity實(shí)體压固,對(duì)數(shù)據(jù)庫(kù)操作
那 Entity
又是什么呢? Entity
是由 Model
創(chuàng)建的實(shí)體靠闭,他的操作也會(huì)影響數(shù)據(jù)庫(kù)帐我。
新建 insert.js
,輸入以下代碼:
// 引入U(xiǎn)ser的Model
const User = require('./user')
//創(chuàng)建一個(gè)插入數(shù)據(jù)到數(shù)據(jù)庫(kù)中的函數(shù)
function insert() {
// 用Model創(chuàng)建一個(gè)Entity實(shí)體,就是一個(gè)User的數(shù)據(jù)
let user_1 = new User({
username: 'Snow',
userpwd: '123456',
userage: 20,
logindate: new Date()
})
// 調(diào)用user_1的save方法愧膀,插入user_1的數(shù)據(jù)到數(shù)據(jù)庫(kù)中
user_1.save(function (err, res) {
if(err){
console.log("Error: " + err)
}else{
console.log("Success Res: " + res)
}
})
}
// 執(zhí)行插入操作
insert()
以上代碼中的 user_1
就是 Model
創(chuàng)建的 Entity
實(shí)體拦键,它具有很多操作, svae()
只是其中一個(gè)檩淋。
運(yùn)行insert.js芬为,命令行輸入框得到以下結(jié)果:
我們?cè)俨榭磾?shù)據(jù)庫(kù)中:
// 查看users集合中的數(shù)據(jù)
db.users.find()
成功插入一個(gè)數(shù)據(jù)啦~
5. 總結(jié)Schema萄金、Model、Entity的關(guān)系
Schema : 一種以文件形式存儲(chǔ)的數(shù)據(jù)庫(kù)模型骨架媚朦,不具備數(shù)據(jù)庫(kù)的操作能力
Model : 由Schema發(fā)布生成的模型氧敢,具有抽象屬性和行為的數(shù)據(jù)庫(kù)操作對(duì)
Entity : 由Model創(chuàng)建的實(shí)體,他的操作也會(huì)影響數(shù)據(jù)庫(kù)
Schema询张、Model孙乖、Entity的關(guān)系是:Schema生成Model,Model創(chuàng)造Entity份氧,Model和Entity都可對(duì)數(shù)據(jù)庫(kù)操作造成影響唯袄,但Model比Entity更具操作性。
三蜗帜、mongoose的其他操作
更新數(shù)據(jù)
這里我們是直接用Model來(lái)操作數(shù)據(jù)庫(kù)恋拷,新建update.js
// 引入U(xiǎn)ser的Model
const User = require("./user")
function update(){
// wherestr是我們要進(jìn)行操作的數(shù)據(jù)
let wherestr = {'username' : 'Snow'}
// update是我們更新的數(shù)據(jù)
let updatestr = {'userpwd': 'hhhhhh'}
User.update(wherestr, updatestr, function(err, res){
if (err) {
console.log("Error:" + err)
}
else {
console.log("Update Res: " + res)
}
})
}
update()
刪除數(shù)據(jù)
新建remove.js,輸入以下代碼:
const User = require("./user")
function del() {
//需要?jiǎng)h除的數(shù)據(jù)
let wherestr = {'username' : 'Snow'}
User.remove(wherestr,function (err, res) {
if(err){
console.log("Error: " + err)
}else{
console.log("Success Remove: " + res)
}
})
}
del()