在做自己的一个小项目时,新学习了mongodb非关系型数据库,使用了mongoose封装好的查询方法,包括数据库分页用到的limit和skip方法,这里记录下。
参照官网文档对应的参数如下:
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');
});
数据类型有:String,Number,Date,Buffer,Boolean,ObjectId,Array,Mixed,Map,Decimal128
在数据库直接用insert方法进行数据插入时,若不强制指定数字的类型,则默认是插入double型数字
先要新建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': ''});
}
});
使用find方法
record.find((err, docs) => {
if (err) {
res.send({ 'status': -1, 'msg': '参数错误' });
} else {
res.send({ 'status': 200, 'msg': '查询成功', 'result': docs});
}
});
更新一条数据: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': '清空成功'});
}
})
/* 第一个为要删除的内容的参数 */
record.findOneAndDelete({_id: req.body.id}, (err, doc) => {
if(err) {
res.send({'status': -1, 'msg': '删除失败'});
} else {
res.send({'status': 200, 'msg': '删除成功'});
}
})
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}
$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}}}
MongoDB 3.0之后,explain的返回与使用方法与之前版本有了不少变化,介于3.0之后的优秀特色,本文仅针对MongoDB 3.0+的explain进行讨论。现版本explain有三种模式,分别如下:queryPlanner、executionStats、allPlansExecution
Redis、MongoDB及Memcached的基本概念、特点、应用场景、Redis是一个key-value存储系统(布式内缓存,高性能的key-value数据库);MongoDB是一个介于关系数据库和非关系数据库之间的产品;Memcached是一个高性能的分布式内存对象缓存系统
本教程介绍mongodb中添加用户的一些操作,mongodb中的用户是什么?在mongodb中通过用户来管理每个数据库的权限,想要控制数据库的使用权,就需要添加用户,给指定的用户分配权限,让特定用户来做特定的操作。
插入数据例:向默认的test数据库的wj表中插入数据;查询数据查询test数据库的wj表中name值不为测试的数据;更新数据;
我需要把原来的 MongoDB 数据完整拷贝到新服务器上,查了一下实现方式蛮多的,但我觉得都不如写个 node 脚本来实现自由方便,这个方式也应该没有跨版本不兼容的坑
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!