mongodb数据库及数据分页-个人文章-SegmentFault思否
程序员文章站
2022-06-07 20:07:32
在做自己的一个小项目时,新学习了mongodb非关系型,使用了mongoose封装好的查询方法,包括数据库分页用到的limit和skip方法,这里记录下。
1. 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}}}
正在努力学习中,若对你的学习有帮助,留下你的印记呗(点个赞咯^_^)
往期好文推荐:
使用vue开发移动端管理后台 实现单行及多行文字超出后加省略号 node之本地服务器图片上传 纯css实现瀑布流(multi-column多列及flex布局)