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
二,安裝配置
第一步:安裝模塊
1 cnpm install mongoose --save
第二步:引入模塊
1 // 引入模塊 2 var mongoose=require('mongoose');
第三步:配置連接
1 var options = { 2 db_user: "myAdminUser",//添加的普通賬戶名 3 db_pwd: "myAdminPass", 4 db_host: "127.0.0.1", 5 db_port: 27017, 6 db_name: "jackson_YingQi",//數據庫名稱 7 useNewUrlParser: true 8 }; 9 10 var dbURL = "mongodb://" + options.db_user + ":" + options.db_pwd + "@" + options.db_host + ":" + options.db_port + "/" + options.db_name; 11 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
第四步:獲取數據庫連接句柄
1 // 得到數據庫連接句柄 2 let dbHandle = mongoose.connection;
第五步:通過數據庫句柄,監聽mongoose
//通過 數據庫連接句柄,監聽mongoose數據庫成功的事件 dbHandle.on('open', function (err) { if (err) { console.log('數據庫連接失敗'); throw err; } console.log('數據庫連接成功') })
第六步:定義表數據結構table.json
1 { 2 "User": { 3 "title": "String", 4 "description": "String", 5 "by": "String", 6 "url": "String", 7 "tags": "Array", 8 "likes": "Number" 9 } 10 }
第七步:表的數據結構和表關聯
1 let MongoDbAction = {} 2 let filename = path.join(path.dirname(__dirname).replace('app', ''), 'config/table.json'); 3 let tabConf = JSON.parse(fs.readFileSync(path.normalize(filename))); 4 /** 5 * 6 * @param table_name 表名 7 */ 8 MongoDbAction.getConnection = function (table_name) { 9 //定義表數據結構 10 var userModel = new mongoose.Schema(tabConf[table_name], { 11 versionKey: false //去除: - -v 12 }) 13 // 將表的數據結構和表關聯起來 14 // var productModel=mongoose.model('anyname',表的數據結構,表名) 15 var client = mongoose.model(table_name, userModel, table_name); 16 return client; 17 };
第八步:數據庫操作
常用操作方法,可以查看官方文檔
1,插入數據
單條:
1 /** 2 * 插入單條數據 3 * @param table_name 表名 4 * @param insertData 插入的數據 5 * @param callback 回調方法 6 */ 7 MongoDbAction.insertData= function (table_name, insertData , callback) { 8 var node_model = this.getConnection(table_name); 9 node_model.insertOne(insertData , function (err, res) { 10 if (err) { 11 callback(err); 12 } else { 13 callback(null, res); 14 } 15 }); 16 };
多條:
1 /** 2 * 插入多條數據 3 * @param table_name 表名 4 * @param insertData 插入的數據 5 * @param callback 回調方法 6 */ 7 8 MongoDbAction.insertMany = function (table_name, insertData, callback) { 9 var node_model = this.getConnection(table_name); 10 node_model.insertMany(insertData,function(err,res){ 11 if(err){ 12 callback(err); 13 } 14 else { 15 callback(null, res); 16 } 17 }); 18 };
console.log("插入的文檔數量為: " + res.insertedCount);res.insertedCount 為插入的條數。
2,查詢數據
單條:
1 /** 2 * 查詢單條數據 3 * @param table_name 表名 4 * @param conditions 查詢條件 5 * @param callback 回調方法 6 */ 7 MongoDbAction.findOne = function (table_name, conditions, callback) { 8 var node_model = this.getConnection(table_name); 9 node_model.findOne(conditions, function (err, res) { 10 if (err) { 11 callback(err); 12 } else { 13 callback(null, res); 14 } 15 }); 16 };
1 /** 2 * 根據_id查詢指定的數據 3 * @param table_name 表名 4 * @param _id 可以是字符串或 ObjectId 對象。 5 * @param callback 回調方法 6 */ 7 MongoDbAction.findById = function (table_name, _id, callback) { 8 var node_model = this.getConnection(table_name); 9 node_model.findById(_id, function (err, res){ 10 if (err) { 11 callback(err); 12 } else { 13 callback(null, res); 14 } 15 }); 16 };
多條:
1 /** 2 * 查詢數據 3 * @param table_name 表名 4 * @param conditions 查詢條件 5 * @param fields 待返回字段 6 * @param callback 回調方法 7 */ 8 MongoDbAction.find = function (table_name, conditions, fields, callback) { 9 var node_model = this.getConnection(table_name); 10 node_model.find(conditions, fields || null, {}, function (err, res) { 11 if (err) { 12 callback(err); 13 } else { 14 callback(null, res); 15 } 16 }); 17 };
1 /** 2 * 連寫查詢 3 * @param table_name 表名 4 * @param conditions 查詢條件 {a:1, b:2} 5 * @param options 選項:{fields: "a b c", sort: {time: -1}, limit: 10} 6 * @param callback 回調方法 7 */ 8 MongoDbAction.where = function (table_name, conditions, options, callback) { 9 var node_model = this.getConnection(table_name); 10 node_model.find(conditions) 11 .select(options.fields || '') 12 .sort(options.sort || {}) 13 .limit(options.limit || {}) 14 .exec(function (err, res) { 15 if (err) { 16 callback(err); 17 } else { 18 callback(null, res); 19 } 20 }); 21 };
返回條數可以使用 limit() 方法,該方法只接受一個參數,指定了返回的條數。
排序 使用 sort() 方法,該方法接受一個參數,規定是升序(1)還是降序(-1)。
指定跳過的條數,可以使用 skip() 方法。
1 /** 2 * 連接查詢 $lookup 來實現左連接。 3 * @param table_name 表名 4 * @param conditions 查詢條件 5 * @param callback 回調方法 6 */ 7 MongoDbAction.findOne = function (table_name, conditions, callback) { 8 var node_model = this.getConnection(table_name); 9 node_model.aggregate([ 10 { $lookup: 11 { 12 from: 'products', // 右集合 13 localField: 'product_id', // 左集合 join 字段 14 foreignField: '_id', // 右集合 join 字段 15 as: 'orderdetails' // 新生成字段(類型array) 16 } 17 } 18 ], function (err, res) { 19 if (err) { 20 callback(err); 21 } else { 22 callback(null, res); 23 } 24 }); 25 };
mongoDB 不是一個關系型數據庫,但我們可以使用 $lookup 來實現左連接。
3,更新數據
單條:
1 /** 2 * 更新單條數據 3 * @param table_name 表名 4 * @param conditions 查詢條件 {"name":'jackson影琪'}; 5 * @param updateStr 更新數據 {$set: { "url" : "https://www.cnblogs.com/jackson-zhangjiang" }}; 6 * @param callback 回調方法 7 */ 8 MongoDbAction.updateOne= function (table_name, conditions,updateStr , callback) { 9 var node_model = this.getConnection(table_name); 10 node_model.updateOne(conditions,updateStr, function (err, res) { 11 if (err) { 12 callback(err); 13 } else { 14 callback(null, res); 15 } 16 }); 17 };
多條:
1 /** 2 * 更新多條數據 3 * @param table_name 表名 4 * @param conditions 查詢條件 {"type":'1'}; 5 * @param updateStr 更新數據 {$set: { "url" : "https://www.cnblogs.com/jackson-zhangjiang" }}; 6 * @param callback 回調方法 7 */ 8 MongoDbAction.updateMany= function (table_name, conditions,updateStr , callback) { 9 var node_model = this.getConnection(table_name); 10 node_model.updateMany(conditions,updateStr, function (err, res) { 11 if (err) { 12 callback(err); 13 } else { 14 console.log(res.result.nModified + " 條文檔被更新"); 15 callback(null, res); 16 } 17 }); 18 };
result.nModified 為更新的條數。
4,刪除數據
單條:
1 /** 2 * 刪除單條數據 3 * @param table_name 表名 4 * @param conditions 查詢條件 {"name":'jackson影琪'}; 5 * @param callback 回調方法 6 */ 7 MongoDbAction.deleteOne= function (table_name, conditions, callback) { 8 var node_model = this.getConnection(table_name); 9 node_model.deleteOne(conditions, function (err, res) { 10 if (err) { 11 callback(err); 12 } else { 13 callback(null, res); 14 } 15 }); 16 };
多條:
1 /** 2 * 刪除條數據 3 * @param table_name 表名 4 * @param conditions 查詢條件 {"type":'1'}; 5 * @param callback 回調方法 6 */ 7 MongoDbAction.deleteMany= function (table_name, conditions, callback) { 8 var node_model = this.getConnection(table_name); 9 node_model.deleteMany(conditions, function (err, res) { 10 if (err) { 11 callback(err); 12 } else { 13 console.log(obj.result.n + " 條文檔被刪除"); 14 callback(null, res); 15 } 16 }); 17 };
obj.result.n 刪除的條數。
以使用 drop() 方法來刪除集合
三,常用方法拋出接口
以查出一條數據為例,其他的方法類似
引入
1 //先包含進來 2 var MongoDB = require('../services/db_mongodb.js');
拋出接口
1 router.put('/user/getSingleData', function (req, res) { 2 var singleId = req.body.singleId;//'5c4036b04471e7c18ef8f57f' 3 var tableName = req.body.tableName;//'User' 4 let data = { 5 httpCode:200, 6 message:"查詢成功!", 7 data:null, 8 } 9 //查詢一條數據 10 MongoDB.findOne(tableName, {_id:singleId}, function (err, result) { 11 if(!err){ 12 data.data= result 13 res.status(data.httpCode).json(data); 14 }else{ 15 data.httpCode=500 16 data.message="查詢失敗!" 17 data.data= err 18 res.status(data.httpCode).json(data); 19 } 20 }); 21 })
成功返回的結果
失敗返回的結果