NodeJs連接操作MongoDB數據庫


NodeJs連接操作MongoDB數據庫

一,介紹

MongoDB是一種文檔導向數據庫管理系統,由C++撰寫而成。介紹如何使用 Node.js 來連接 MongoDB,並對數據庫進行操作。

Mongoose是在node.js異步環境下對mongodb進行便捷操作的對象模型工具。版本:5.4.4

  1. Github地址:https://github.com/Automattic/mongoose
  2. 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);// 連接數據庫

連接的方式有

  1. 連接本地數據庫服務器,端口是默認的:mongodb://localhost
  2. 使用用戶名myAdminUser,密碼myAdminPass登錄localhost的admin數據庫:mongodb://myAdminUser:myAdminPass@localhost
  3. 使用用戶名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 })

成功返回的結果

失敗返回的結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM