mongodb數據庫及數據分頁

在做自己的一個小項目時,新學習了mongodb非關係型數據庫,使用了mongoose封裝好的查詢方法,包括數據庫分頁用到的limit和skip方法,這裏記錄下。

1. mongodb數據庫連接

  • 參照官網文檔對應的參數如下:
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
  • 使用mongoose進行數據庫的連接
const dataBaseUrl = config.admin.username
  ? `mongodb://${config.admin.username}:${config.admin.pwd}@${config.host}/share-resource`
  : `mongodb://${config.host}/share-resource`;
mongoose.connect(dataBaseUrl, { useNewUrlParser: true });
  • 若出現警告信息:要求使用新的編譯方式,則在連接的時候加上useNewUrlParser: true
DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version.
To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.
mongoose.connect(dataBaseUrl, { useNewUrlParser: true });
  • 在連接數據庫時,對連接操作進行監聽處理
mongoose.connection.on('connected', function() {
  console.log('Mongoose connection open to ' + dataBaseUrl);
});
/* 連接數據庫異常 */
mongoose.connection.on('error', function(err) {
  console.log('Mongoose connection error:' + err);
});
/* 連接數據庫斷開 */
mongoose.connection.on('disconnected', function() {
  console.log('Mongoose connection disconnected');
});

2. 數據類型(mongoose中提供的schemaTypes)

  • 數據類型有:String,Number,Date,Buffer,Boolean,ObjectId,Array,Mixed,Map,Decimal128
  • 在數據庫直接用insert方法進行數據插入時,若不強制指定數字的類型,則默認是插入double型數字

3. mongoose對數據庫操作的方法

3.1 數據的插入

  • 先要新建schema文件
const mongoose = require('../database/mongodbHelper');
const Message= mongoose.Schema;
const RecordModel = new Message({
  message: String,
  name: String,
  num: Number,
},{
  versionKey: false
});
module.exports = mongoose.model('using_records', RecordModel);
  • 在使用schema對進行數據的插入時,若直接插入,則會在新的集合中多出一個_v字段,這個代表的是集合的版本號,可以在schema中加入versionKey: false來刪除_v字段
  • 數據插入:使用save方法
const record= new Record({
    message: req.body.message,
    name: req.body.name,
    num: req.body.num,
});
record.save((err, docs) => {
  if (err) {
    res.send({ 'status': -1, 'msg': '插入失敗' });
  } else {
    res.send({ 'status': 200, 'msg': '插入成功', 'result':  ''});
  }
});

3.2 數據的查詢

  • 使用find方法
record.find((err, docs) => {
  if (err) {
    res.send({ 'status': -1, 'msg': '參數錯誤' });
  } else {
    res.send({ 'status': 200, 'msg': '查詢成功', 'result':  docs});
  }
});

3.3 數據的更新

  • 更新一條數據:updateOne
/* 第一個參數爲查詢參數,第二個爲要更新的內容,第三個爲回調方法 */
record.updateOne({_id: id}, updateInfo, (err, doc) => {
    if(err) {
      res.send({'status': -1, 'msg': '更新失敗', 'result': ''});
    } else {
      res.send({'status': 200, 'msg': '更新成功', 'result': ''});
    }
})
  • 更新多條數據:updateMany
record.updateMany({user_info: {$elemMatch: {user_id: userId, status: 1, is_delete: 1}}}, {$set: {'user_info.$.is_delete': 3}}, (err, doc) => {
    if(err) {
      res.send({'status': -1, 'msg': '參數錯誤'});
    } else {
      res.send({'status': 200, 'msg': '清空成功'});
    }
})

3.4 數據的刪除

/* 第一個爲要刪除的內容的參數 */
record.findOneAndDelete({_id: req.body.id}, (err, doc) => {
    if(err) {
      res.send({'status': -1, 'msg': '刪除失敗'});
    } else {
      res.send({'status': 200, 'msg': '刪除成功'});
    }
})

4. 數據庫的分頁操作(limit和skip方法)

  • limit()方法爲限制數據庫每次查詢的數據條數;skip(param)跳過param條數據不查詢
/* page: 頁碼;pagesize: 每頁的數量 */
let page = req.body.page;
let pagesize = req.body.pagesize;
let queryResult = collection.find(queryCondition).limit(pageSize).skip((page - 1) * pageSize).sort({'_id': -1});
queryResult.exec((err, value) => {
  if(err) {
    reject(err);
  } else {
    resolve({total, value});
  }
})

5.匹配數據

  • 匹配數據中的數組裏的某個對象裏的某個字段,使用$set來設置對應的值
$set: {'user_info.$.status': 1}
  • $elemMath只匹配第一條數據,當數組裏存在多條一樣的數據時,只返回第一條數據
let arr = [
    {
        is_delete: 1,
        name: 'a'
    },
    {
        is_delete: 1,
        name: 'b'
    }
]
{$elemMatch: {is_delete: 1}}只匹配arr的第一條數據
  • aggregate匹配多條數據
/* aggregate聚合操作,$unwind將數組拆分成單個元素
   * $group 分組依據
   * $sum 統計
   * $project 將返回值進行篩選,是否返回篩選完後的某個字段
   * */
  message.aggregate([
    {
      $match: {
        'user_info.user_id': id,
        'user_info.is_delete': 0
      }
    },
    {
      $unwind: '$user_info'
    },
    {
      $group: {
        _id: {status: '$user_info.status',},
        count: {$sum: 1}
      }
    },
    {
      $project: {
        '_id': 0,
        'status': '$_id.status',
        'count': 1
      }
    }
  ]).then()
  • 對於匹配數組裏的某項中的某個字段
let arr = [
    {
        is_delete: 1,
        name: 'a'
    },
    {
        is_delete: 1,
        name: 'b'
    }
]
/* 匹配arr中的name */
$match: {
    'arr.name': 'a'
}
/* 分組篩選 */
$ group: {
    _id: {name: '$arr.name'}
}
  • 對對象中的數組進行插入數據操作
let obj = {
    id: 1,
    arr: [
        {
            is_delete: 1,
            name: 'a'
        },
        {
            is_delete: 1,
            name: 'b'
        }
    ]
}
{'$push': {arr: {name: 'c', is_delete: 0}}}
正在努力學習中,若對你的學習有幫助,留下你的印記唄(點個贊咯^_^)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章