内容简介:在做自己的一个小项目时,新学习了mongodb非关系型数据库,使用了mongoose封装好的查询方法,包括数据库分页用到的limit和skip方法,这里记录下。DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version.正在努力学习中,若对你的学习有帮助,留下你的印记呗(点个赞咯^_^)
在做自己的一个小项目时,新学习了 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.
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}}}
正在努力学习中,若对你的学习有帮助,留下你的印记呗(点个赞咯^_^)
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 4 万字全面掌握数据库、数据仓库、数据集市、数据湖、数据中台
- Python3爬虫数据入数据库---把爬取到的数据存到数据库,带数据库去重功能
- Oracle数据库查询重复数据及删除重复数据方法
- sqlserver数据库获取数据库信息
- 从大数据到数据库
- node连接oracle数据库,更新数据后,数据库中不生效问题
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Rationality for Mortals
Gerd Gigerenzer / Oxford University Press, USA / 2008-05-02 / USD 65.00
Gerd Gigerenzer's influential work examines the rationality of individuals not from the perspective of logic or probability, but from the point of view of adaptation to the real world of human behavio......一起来看看 《Rationality for Mortals》 这本书的介绍吧!