mongoose建立資料結構,實現基本增刪改查功能
首先建議建立如下目錄結構的一個express專案目錄結構
--server
--bin//這個檔案目錄是放置express專案啟動項檔案
--models//放置對應資料的結構
--public//前端頁面以及靜態資源
--routes//後端業務邏輯
--util//公用工具
app.js //express的配置檔案
package.json //依賴包檔案
1、利用mongoose連結資料庫
這裡預設mongoose資料庫是已經啟動了的
這個地方如果沒有對應資料庫沒有關係,在執行響應的mongoose操作資料庫的命令的時候會自動建立資料庫的var mongoose = require('mongoose'); //連結資料庫 mongoose.connect('mongodb://127.0.0.1/[對應你資料庫的名字]'); mongoose.connection.on('connected', () => { console.log('MoogoDB connect success') }); mongoose.connection.on('error', () => { console.log('MoogoDB connect fail') }); mongoose.connection.on('disconnected', () => { console.log('MoogoDB connect disconnected') });
2、建立對應資料結構對映
var mongoose = require('mongoose'); var userSchema = new mongoose.Schema({ "userId":String, "userName":String, "userPwd":String, "orderList":Array, "cartList":[ { "productId":String, "productName":String, "salePrice":String, "productImage":String, "checked":String, "productNum":String } ], "addressList":[ { "addressId": String, "userName": String, "streetName": String, "postCode": Number, "tel": Number, "isDefault": Boolean } ] }); //資料庫集合要加s,如果沒有因為對應資料庫集合的時候,是預設第一個引數加s之後再去匹配資料庫的 //如果這裡的模型和資料庫集合名字不匹配,那麼這個模型接受第三個引數,就是資料庫的名字!!!!這一點非常重要非常重要 module.exports = mongoose.model("User",userSchema);
3、新增資料到資料庫
* 首先第一點,就是對應表結構的時候,一定要嚴格來定義
*
* 第一個功能插入資料庫(增加資料庫):Schema例項化一個對應資料庫的物件
* 增加資料庫有兩個方法,一個save(),另外一個是create()方法
* 支援內部回撥,內部回撥分別是err,doc,
* 外部promise回撥的引數分別是doc,len,err
* 這兩個方法的區別是,save是,如果沒有,建立新的物件集合,如果有,就覆蓋舊的物件集合
* create()不管有沒有舊的物件集合,都建立新的物件集合(可能會出現很多相同的物件集合)
* 具體情況分業務場景來定!
3.1、建立對應資料結構對映資料庫檔案:
let lele = mongoose.model('lele', {
result: {
size: Number,
address: {}
}
});
let le = new lele({
result: {
size: 15,
address: {
detail: '北京',
name: 'yanle'
}
}
});
3.2、通過save()來儲存資料,通過promise拿到回到
router.get('/create', (req, res, next) => {
//回撥第一個引數是結果,第二個引數是返回影響資料條數,第三個引數是異常
le.save().then((doc, len,err)=>{
console.log(`result :${doc}`);
console.log(`err: ${err}`);
console.log(`three : ${len}`);
res.status(200).json(doc);
});
});
3.3、通過create()來儲存資料router.get('/create', (req, res, next) => {
//回撥第一個引數是異常,第二個引數是結果,第三個引數是資料條數
lele.create({
result: {
size: 16,
address: {
detail: '重慶'
},
name: 'yanle'
}
}, (err, doc, len) => {
console.log(`result :${doc}`);
console.log(`err: ${err}`);
console.log(`three : ${len}`);
res.status(200).json(doc);
})
});
3.4、通過create()來儲存資料,通過promise拿到回撥
router.get('/create', (req, res, next) => {
//回撥第一個引數是結果,第二個引數是資料條數,第三個引數是異常
lele.create({
result: {
size: 16,
address: '北京'
}
}).then((doc, len, err) => {
console.log(`result :${doc}`);
console.log(`err: ${err}`);
console.log(`three : ${len}`);
res.status(200).json(doc);
});
});
4、修改資料update()和updateMany():
//這種辦法實際上update只能修改一個數據! updateMany就可以批量修改了
router.get('/update', (req, res, next) => {
lele.updateMany({
'result.size':16
}, {
$set: {
'result.address': '不告訴你!!!!'
}}, (err, doc) => {
if (err) {
console.log(err)
} else {
console.log(err);
res.status(200).json(doc)
}
})
});
5、查詢資料find()和findOne();
/*查詢*/
router.get('/find',function(req,res,next){
lele.find({
'result.size':16
},(err,data)=>{
res.status(200).json(data);
})
});
find()方法可以查詢符合條件的多條資料,findOne()只能查詢到符合條件的第一條資料
6、刪除資料remove()
router.get('/delete',(req,res,next)=>{
lele.remove({
'result.size':16
},(err,doc)=>{
console.log(err);
console.log(doc);
res.status(200).json(doc)
})
});
總結:以上所有操作資料庫的方法都分為方法內部回撥和方法結束後promise回撥兩種模式:
如果是內部回撥,回撥接受的三個引數分別是:異常、返回的資料結果、返回資料結果的條數
如果是promise回撥,接受的三個引數分別依次為:結果、資料條數、異常
7、關於err的跳坑
* 這裡留下了一個非常坑的程式碼糾正邏輯
* 使用findOne({param},(err,data)={}) 這種方式中的err是返回的異常,如果資料庫中沒有查詢到資料,要對data進行校驗
解決方式1示例:
router.get('/test', function (req, res, next) {
let param = {
userName: 'tom',
userPwd: 123456
};
//獲取cookie的方法
console.log(req.cookies.CNZZDATA1261788850);
User.findOne(param).then((doc) => {
if (doc) {
res.status(200).json({
status: '0',
message: '登入成功',
result: {
userName: doc.userName
}
})
} else {
res.status(401).json({
status: '1',
message: '登入失敗,使用者名稱或者密碼輸入失誤'
})
}
}).catch((err) => {
res.status(500).json(err);
});
});
解決方式2示例:
router.post('/edit',(req,res,next)=>{
var userId='100000077';
var checkAll=req.body.checkAll?"1":0;
User.findOne({
userId:userId
},function(err,user){
if(err){
res.status(500).json(err.message);
}else{
if(user){
user.cartList.forEach((item,index)=>{
item.checked=checkAll;
});
user.save((err1,doc)=>{
if(err1){
res.status(500).json(err.message);
}else{
res.status(200).json({
status: '0',
message: '儲存成功',
})
}
})
}else{
res.status(200).json({
status: '1',
message: '修改失敗'
})
}
}
})
});