NodeJs操作MongoDB之分頁功能與常見問題


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});//連接數據庫

 


免責聲明!

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



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