网站上线盈利,网站服务器 购买时长,c 开发商城网站开发,福田手机网站建设本文转载于 SegmentFault 社区作者#xff1a;小小蚊子在做自己的一个小项目时#xff0c;新学习了 mongodb非关系型数据库#xff0c;使用了 mongoose封装好的查询方法#xff0c;包括数据库分页用到的limit和 skip 方法#xff0c;这里记录下。一mongodb 数据库连接参照… 本文转载于 SegmentFault 社区作者小小蚊子 在做自己的一个小项目时新学习了 mongodb非关系型数据库使用了 mongoose封装好的查询方法包括数据库分页用到的limit和 skip 方法这里记录下。 一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: trueDeprecationWarning: 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);});二数据类型数据类型 (mongoose 中提供的 schemaTypes)数据类型有StringNumberDateBufferBooleanObjectIdArrayMixedMapDecimal128在数据库直接用 insert 方法进行数据插入时若不强制指定数字的类型则默认是插入double型数字。三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: }); }})更新多条数据updateManyrecord.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: 删除成功}); }}) 四数据库的分页操作数据库的分页操作(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}); }})五匹配数据匹配数据中的数组里的某个对象里的某个字段使用 $set 来设置对应的值$set: {user_info.$.status: 1}$elemMat 只匹配第一条数据当数组里存在多条一样的数据时只返回第一条数据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()对于匹配数组里的某项中的某个字段/* 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}} - END -