NodeJs操作MongoDB之分頁功能與常見問題
一,方法介紹
1,聚合操作之count
count()方法可以查詢統計符合條件的集合的總數
1 db.User.count(<query>) // 此方法等價於 db.User.find(<query>).count()
在分布式集合中,會出現計算錯誤的情況,這個時候推薦使用aggregate;
2,find() 方法以非結構化的方式來顯示所有文檔。
1 db.User.find();//相當於:select* from User;
3,exec() 方法用於檢索字符串中的正則表達式的匹配。(javascript方法)
4,sort() 方法對數據進行排序,sort() 方法可以通過參數指定排序的字段,並使用 1 和 -1 來指定排序的方式,其中 1 為升序排列,而 -1 是用於降序排列。
1 升序:db.User.find().sort({CreateTime: 1}); 2 降序:db.User.find().sort({CreateTime: -1});
5,skip()方法來跳過指定數量的數據,skip方法同樣接受一個數字參數作為跳過的記錄條數。
1 db.User.find().skip(2)//跳過2條
6,limit()方法接受一個數字參數,該參數指定從MongoDB中讀取的記錄條數。一般與skip連用
1 # limit()中number值為空時代表全部查出 2 db.User.find().limit(2) #讀取的條數
1 # 常用在分頁方法中 2 # 查詢User集合中,跳過前兩條記錄,每頁一條記錄 3 > db.User.find().skip(2).limit(1)
二,封裝與接口拋出
2.1,分頁查詢
1,根據查詢條件獲取總條數,使用count({},callback)方法
1 /** 2 * 根據條件獲取有多少條數據 文檔數 3 * @param table_name 表名 4 * @param conditions 查詢條件 {a:1, b:2} 5 * @param callback 回調方法 6 */ 7 MongoDbAction.getTotal = function (table_name, conditions, callback) { 8 var node_model = this.getConnection(table_name); 9 if (!node_model || node_model.message) { 10 if (callback) callback(1, node_model) 11 } else { 12 node_model.find(conditions) 13 .count({}) 14 .exec(function (err, total) { 15 if (err) { 16 if (callback) callback(err); 17 } else { 18 if (callback) callback(null, total); 19 } 20 }); 21 } 22 };
2,實現連寫查詢
(1)這個可以用來做分頁,表示獲取從第1條(第1條記錄序號為0)記錄開始的10條記錄.類似與Mysql的limit 0, 10,如下:
{
limit:10,//pageSize
skip:0//page:skip+1
}
(2)按某個字段升序(1)降序(-1),如下 按照創建時間進行降序排列
sort: {CreateTime: -1},
(3)代碼連寫查詢實現:
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.whereCondition = function (table_name, conditions, options, callback) { 9 var node_model = this.getConnection(table_name); 10 if (!node_model || node_model.message) { 11 if (callback) callback(1, node_model) 12 } else { 13 node_model.find(conditions) 14 .select(options.fields || '') 15 .sort(options.sort || {})//排序 //按某個字段升序(1)降序(-1) 16 .skip(options.skip || 0)//跳過的條數 17 .limit(options.limit || {})//查詢幾條 18 .exec(function (err, res) { 19 if (err) { 20 if (callback) callback(err); 21 } else { 22 if (callback) callback(null, res); 23 } 24 }); 25 } 26 };
3,根據所傳的參數實現分頁查詢
拋出分頁查詢的接口
1 //連寫查詢數據 包括分頁 獲取總條數 2 router.put('/user/getSingleAndManyData', function (req, res) { 3 var tableName = req.body.tableName;//'User' 4 var IsEnable = req.body.IsEnable; 5 var limit = req.body.pageSize; 6 var sort = req.body.sort; 7 var skip = req.body.page; 8 let conditions = { 9 IsEnable 10 } 11 let options = { 12 sort: {CreateTime: sort},//排序 13 limit,//pageSize 14 skip:(limit*(skip-1))//page 15 } 16 // let options = { 17 // sort: {CreateTime: -1},//按某個字段升序(1)降序(-1) 18 // limit:10, 19 // skip:(limit*(skip-1))//skip=1=> skip:0 20 // } 21 // 這個可以用來做分頁,表示獲取從第1條(第1條記錄序號為0)記錄開始的10條記錄.類似與Mysql的limit 0, 10 22 let data = { 23 httpCode: 200, 24 message: "查詢成功!", 25 status: 1, 26 data: null, 27 page:skip, 28 pageSize:limit 29 } 30 31 MongoDbAction.getTotal(tableName,conditions, function (err, total) { 32 if (err) { 33 data.total=0 34 data.status = 0 35 data.message = "未查詢到數據!" 36 data.data = null 37 res.status(data.httpCode).json(data); 38 } else { 39 MongoDbAction.whereCondition(tableName,conditions,options, function (err, result) { 40 if (!err) { 41 data.total=total 42 data.data = result 43 res.status(data.httpCode).json(data); 44 } else { 45 data.total=0 46 data.status = 0 47 data.message = "未查詢到數據!" 48 data.data = result 49 res.status(data.httpCode).json(data); 50 } 51 }); 52 } 53 }); 54 55 })
4,接口調用,返回的結果集如下:
三,常見問題
1,連接警告
警告:(node:204) 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.
1 mongoose.connect(dbURL);// 連接數據庫 存在警告
解決辦法:連接配置添加: { useNewUrlParser: true }
1 mongoose.connect(dbURL,{useNewUrlParser:true});//連接數據庫