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}}}

正在努力进修中,若对你的进修有协助,留下你的印记呗(点个赞咯^_^)

    原文作者:ZJW0215
    原文地址: https://segmentfault.com/a/1190000018954475
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞