1. 程式人生 > >mongoose建立資料結構,實現基本增刪改查功能

mongoose建立資料結構,實現基本增刪改查功能

首先建議建立如下目錄結構的一個express專案目錄結構


--server

--bin//這個檔案目錄是放置express專案啟動項檔案

--models//放置對應資料的結構

--public//前端頁面以及靜態資源

--routes//後端業務邏輯

--util//公用工具

    app.js  //express的配置檔案

    package.json //依賴包檔案

1、利用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')
});
這個地方如果沒有對應資料庫沒有關係,在執行響應的mongoose操作資料庫的命令的時候會自動建立資料庫的

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: '修改失敗'
        })
      }
    }
  })
});