NodeJs连接操作MongoDB数据库
一,介绍
MongoDB是一种文档导向数据库管理系统,由C++撰写而成。介绍如何使用 Node.js 来连接 MongoDB,并对数据库进行操作。
Mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具。版本:5.4.4
- Github地址:https://github.com/Automattic/mongoose
- API Docs:http://mongoosejs.com/docs/guide.html
二,安装配置
第一步:安装模块
cnpm install mongoose --save
第二步:引入模块
// 引入模块
var mongoose=require('mongoose');
第三步:配置连接
var options = {
db_user: "myAdminUser",//添加的普通账户名
db_pwd: "myAdminPass",
db_host: "127.0.0.1",
db_port: 27017,
db_name: "jackson_YingQi",//数据库名称
useNewUrlParser: true
}; var dbURL = "mongodb://" + options.db_user + ":" + options.db_pwd + "@" + options.db_host + ":" + options.db_port + "/" + options.db_name;
mongoose.connect(dbURL);// 连接数据库
连接的方式有
- 连接本地数据库服务器,端口是默认的:mongodb://localhost
- 使用用户名myAdminUser,密码myAdminPass登录localhost的admin数据库:mongodb://myAdminUser:myAdminPass@localhost
- 使用用户名myAdminUser,密码myAdminPass登录localhost的jackson_YingQi数据库:mongodb://myAdminUser:myAdminPass@localhost/jackson_YingQi
更多连接方式,听查看http://www.runoob.com/mongodb/mongodb-connections.html
第四步:获取数据库连接句柄
// 得到数据库连接句柄
let dbHandle = mongoose.connection;
第五步:通过数据库句柄,监听mongoose
//通过 数据库连接句柄,监听mongoose数据库成功的事件
dbHandle.on('open', function (err) {
if (err) {
console.log('数据库连接失败');
throw err;
}
console.log('数据库连接成功')
})
第六步:定义表数据结构table.json
{
"User": {
"title": "String",
"description": "String",
"by": "String",
"url": "String",
"tags": "Array",
"likes": "Number"
}
}
第七步:表的数据结构和表关联
let MongoDbAction = {}
let filename = path.join(path.dirname(__dirname).replace('app', ''), 'config/table.json');
let tabConf = JSON.parse(fs.readFileSync(path.normalize(filename)));
/**
*
* @param table_name 表名
*/
MongoDbAction.getConnection = function (table_name) {
//定义表数据结构
var userModel = new mongoose.Schema(tabConf[table_name], {
versionKey: false //去除: - -v
})
// 将表的数据结构和表关联起来
// var productModel=mongoose.model('anyname',表的数据结构,表名)
var client = mongoose.model(table_name, userModel, table_name);
return client;
};
第八步:数据库操作
常用操作方法,可以查看官方文档
1,插入数据
单条:
/**
* 插入单条数据
* @param table_name 表名
* @param insertData 插入的数据
* @param callback 回调方法
*/
MongoDbAction.insertData= function (table_name, insertData , callback) {
var node_model = this.getConnection(table_name);
node_model.insertOne(insertData , function (err, res) {
if (err) {
callback(err);
} else {
callback(null, res);
}
});
};
多条:
/**
* 插入多条数据
* @param table_name 表名
* @param insertData 插入的数据
* @param callback 回调方法
*/ MongoDbAction.insertMany = function (table_name, insertData, callback) {
var node_model = this.getConnection(table_name);
node_model.insertMany(insertData,function(err,res){
if(err){
callback(err);
}
else {
callback(null, res);
}
});
};
console.log("插入的文档数量为: " + res.insertedCount);res.insertedCount 为插入的条数。
2,查询数据
单条:
/**
* 查询单条数据
* @param table_name 表名
* @param conditions 查询条件
* @param callback 回调方法
*/
MongoDbAction.findOne = function (table_name, conditions, callback) {
var node_model = this.getConnection(table_name);
node_model.findOne(conditions, function (err, res) {
if (err) {
callback(err);
} else {
callback(null, res);
}
});
};
/**
* 根据_id查询指定的数据
* @param table_name 表名
* @param _id 可以是字符串或 ObjectId 对象。
* @param callback 回调方法
*/
MongoDbAction.findById = function (table_name, _id, callback) {
var node_model = this.getConnection(table_name);
node_model.findById(_id, function (err, res){
if (err) {
callback(err);
} else {
callback(null, res);
}
});
};
多条:
/**
* 查询数据
* @param table_name 表名
* @param conditions 查询条件
* @param fields 待返回字段
* @param callback 回调方法
*/
MongoDbAction.find = function (table_name, conditions, fields, callback) {
var node_model = this.getConnection(table_name);
node_model.find(conditions, fields || null, {}, function (err, res) {
if (err) {
callback(err);
} else {
callback(null, res);
}
});
};
/**
* 连写查询
* @param table_name 表名
* @param conditions 查询条件 {a:1, b:2}
* @param options 选项:{fields: "a b c", sort: {time: -1}, limit: 10}
* @param callback 回调方法
*/
MongoDbAction.where = function (table_name, conditions, options, callback) {
var node_model = this.getConnection(table_name);
node_model.find(conditions)
.select(options.fields || '')
.sort(options.sort || {})
.limit(options.limit || {})
.exec(function (err, res) {
if (err) {
callback(err);
} else {
callback(null, res);
}
});
};
返回条数可以使用 limit() 方法,该方法只接受一个参数,指定了返回的条数。
排序 使用 sort() 方法,该方法接受一个参数,规定是升序(1)还是降序(-1)。
指定跳过的条数,可以使用 skip() 方法。
/**
* 连接查询 $lookup 来实现左连接。
* @param table_name 表名
* @param conditions 查询条件
* @param callback 回调方法
*/
MongoDbAction.findOne = function (table_name, conditions, callback) {
var node_model = this.getConnection(table_name);
node_model.aggregate([
{ $lookup:
{
from: 'products', // 右集合
localField: 'product_id', // 左集合 join 字段
foreignField: '_id', // 右集合 join 字段
as: 'orderdetails' // 新生成字段(类型array)
}
}
], function (err, res) {
if (err) {
callback(err);
} else {
callback(null, res);
}
});
};
mongoDB 不是一个关系型数据库,但我们可以使用 $lookup 来实现左连接。
3,更新数据
单条:
/**
* 更新单条数据
* @param table_name 表名
* @param conditions 查询条件 {"name":'jackson影琪'};
* @param updateStr 更新数据 {$set: { "url" : "https://www.cnblogs.com/jackson-zhangjiang" }};
* @param callback 回调方法
*/
MongoDbAction.updateOne= function (table_name, conditions,updateStr , callback) {
var node_model = this.getConnection(table_name);
node_model.updateOne(conditions,updateStr, function (err, res) {
if (err) {
callback(err);
} else {
callback(null, res);
}
});
};
多条:
/**
* 更新多条数据
* @param table_name 表名
* @param conditions 查询条件 {"type":'1'};
* @param updateStr 更新数据 {$set: { "url" : "https://www.cnblogs.com/jackson-zhangjiang" }};
* @param callback 回调方法
*/
MongoDbAction.updateMany= function (table_name, conditions,updateStr , callback) {
var node_model = this.getConnection(table_name);
node_model.updateMany(conditions,updateStr, function (err, res) {
if (err) {
callback(err);
} else {
console.log(res.result.nModified + " 条文档被更新");
callback(null, res);
}
});
};
result.nModified 为更新的条数。
4,删除数据
单条:
/**
* 删除单条数据
* @param table_name 表名
* @param conditions 查询条件 {"name":'jackson影琪'};
* @param callback 回调方法
*/
MongoDbAction.deleteOne= function (table_name, conditions, callback) {
var node_model = this.getConnection(table_name);
node_model.deleteOne(conditions, function (err, res) {
if (err) {
callback(err);
} else {
callback(null, res);
}
});
};
多条:
/**
* 删除条数据
* @param table_name 表名
* @param conditions 查询条件 {"type":'1'};
* @param callback 回调方法
*/
MongoDbAction.deleteMany= function (table_name, conditions, callback) {
var node_model = this.getConnection(table_name);
node_model.deleteMany(conditions, function (err, res) {
if (err) {
callback(err);
} else {
console.log(obj.result.n + " 条文档被删除");
callback(null, res);
}
});
};
obj.result.n 删除的条数。
以使用 drop() 方法来删除集合
三,常用方法抛出接口
以查出一条数据为例,其他的方法类似
引入
//先包含进来
var MongoDB = require('../services/db_mongodb.js');
抛出接口
router.put('/user/getSingleData', function (req, res) {
var singleId = req.body.singleId;//'5c4036b04471e7c18ef8f57f'
var tableName = req.body.tableName;//'User'
let data = {
httpCode:200,
message:"查询成功!",
data:null,
}
//查询一条数据
MongoDB.findOne(tableName, {_id:singleId}, function (err, result) {
if(!err){
data.data= result
res.status(data.httpCode).json(data);
}else{
data.httpCode=500
data.message="查询失败!"
data.data= err
res.status(data.httpCode).json(data);
}
});
})
成功返回的结果
失败返回的结果