NodeJs操作MongoDB教程之分頁功能以及常見問題
一,方法介紹
1,聚合操作之count
count()方法可以查詢統(tǒng)計(jì)符合條件的集合的總數(shù)
1 db.User.count(<query>) // 此方法等價(jià)于 db.User.find(<query>).count()
在分布式集合中,會(huì)出現(xiàn)計(jì)算錯(cuò)誤的情況,這個(gè)時(shí)候推薦使用aggregate;
2,find() 方法以非結(jié)構(gòu)化的方式來顯示所有文檔。
1 db.User.find();//相當(dāng)于:select* from User;
3,exec() 方法用于檢索字符串中的正則表達(dá)式的匹配。(javascript方法)
4,sort() 方法對(duì)數(shù)據(jù)進(jìn)行排序,sort() 方法可以通過參數(shù)指定排序的字段,并使用 1 和 -1 來指定排序的方式,其中 1 為升序排列,而 -1 是用于降序排列。
1 升序:db.User.find().sort({CreateTime: 1});
2 降序:db.User.find().sort({CreateTime: -1});
5,skip()方法來跳過指定數(shù)量的數(shù)據(jù),skip方法同樣接受一個(gè)數(shù)字參數(shù)作為跳過的記錄條數(shù)。
1 db.User.find().skip(2)//跳過2條
6,limit()方法接受一個(gè)數(shù)字參數(shù),該參數(shù)指定從MongoDB中讀取的記錄條數(shù)。一般與skip連用
1 # limit()中number值為空時(shí)代表全部查出 2 db.User.find().limit(2) #讀取的條數(shù)
1 # 常用在分頁方法中 2 # 查詢User集合中,跳過前兩條記錄,每頁一條記錄 3 > db.User.find().skip(2).limit(1)
二,封裝與接口拋出
2.1,分頁查詢
1,根據(jù)查詢條件獲取總條數(shù),使用count({},callback)方法
/**
* 根據(jù)條件獲取有多少條數(shù)據(jù) 文檔數(shù)
* @param table_name 表名
* @param conditions 查詢條件 {a:1, b:2}
* @param callback 回調(diào)方法
*/
MongoDbAction.getTotal = function (table_name, conditions, callback) {
var node_model = this.getConnection(table_name);
if (!node_model || node_model.message) {
if (callback) callback(1, node_model)
} else {
node_model.find(conditions)
.count({})
.exec(function (err, total) {
if (err) {
if (callback) callback(err);
} else {
if (callback) callback(null, total);
}
});
}
};
2,實(shí)現(xiàn)連寫查詢
(1)這個(gè)可以用來做分頁,表示獲取從第1條(第1條記錄序號(hào)為0)記錄開始的10條記錄.類似與Mysql的limit 0, 10,如下:
{
limit:10,//pageSize
skip:0//page:skip+1
}
(2)按某個(gè)字段升序(1)降序(-1),如下 按照創(chuàng)建時(shí)間進(jìn)行降序排列
sort: {CreateTime: -1},
(3)代碼連寫查詢實(shí)現(xiàn):
/**
* 連寫查詢 查詢多條數(shù)據(jù)
* @param table_name 表名
* @param conditions 查詢條件 {a:1, b:2}
* @param options 選項(xiàng):{fields: "a b c", sort: {time: -1}, limit: 10}
* @param callback 回調(diào)方法
*/
MongoDbAction.whereCondition = function (table_name, conditions, options, callback) {
var node_model = this.getConnection(table_name);
if (!node_model || node_model.message) {
if (callback) callback(1, node_model)
} else {
node_model.find(conditions)
.select(options.fields || '')
.sort(options.sort || {})//排序 //按某個(gè)字段升序(1)降序(-1)
.skip(options.skip || 0)//跳過的條數(shù)
.limit(options.limit || {})//查詢幾條
.exec(function (err, res) {
if (err) {
if (callback) callback(err);
} else {
if (callback) callback(null, res);
}
});
}
};
3,根據(jù)所傳的參數(shù)實(shí)現(xiàn)分頁查詢
拋出分頁查詢的接口
//連寫查詢數(shù)據(jù) 包括分頁 獲取總條數(shù)
router.put('/user/getSingleAndManyData', function (req, res) {
var tableName = req.body.tableName;//'User'
var IsEnable = req.body.IsEnable;
var limit = req.body.pageSize;
var sort = req.body.sort;
var skip = req.body.page;
let conditions = {
IsEnable
}
let options = {
sort: {CreateTime: sort},//排序
limit,//pageSize
skip:(limit*(skip-1))//page
}
// let options = {
// sort: {CreateTime: -1},//按某個(gè)字段升序(1)降序(-1)
// limit:10,
// skip:(limit*(skip-1))//skip=1=> skip:0
// }
// 這個(gè)可以用來做分頁,表示獲取從第1條(第1條記錄序號(hào)為0)記錄開始的10條記錄.類似與Mysql的limit 0, 10
let data = {
httpCode: 200,
message: "查詢成功!",
status: 1,
data: null,
page:skip,
pageSize:limit
}
MongoDbAction.getTotal(tableName,conditions, function (err, total) {
if (err) {
data.total=0
data.status = 0
data.message = "未查詢到數(shù)據(jù)!"
data.data = null
res.status(data.httpCode).json(data);
} else {
MongoDbAction.whereCondition(tableName,conditions,options, function (err, result) {
if (!err) {
data.total=total
data.data = result
res.status(data.httpCode).json(data);
} else {
data.total=0
data.status = 0
data.message = "未查詢到數(shù)據(jù)!"
data.data = result
res.status(data.httpCode).json(data);
}
});
}
});
})
4,接口調(diào)用,返回的結(jié)果集如下:

三,常見問題
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);// 連接數(shù)據(jù)庫 存在警告

解決辦法:連接配置添加: { useNewUrlParser: true }
1 mongoose.connect(dbURL,{useNewUrlParser:true});//連接數(shù)據(jù)庫
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
- nodeJS與MySQL實(shí)現(xiàn)分頁數(shù)據(jù)以及倒序數(shù)據(jù)
- Vue+Node實(shí)現(xiàn)商品列表的分頁、排序、篩選,添加購物車功能詳解
- Node.js中Bootstrap-table的兩種分頁的實(shí)現(xiàn)方法
- nodejs mysql 實(shí)現(xiàn)分頁的方法
- nodejs個(gè)人博客開發(fā)第六步 數(shù)據(jù)分頁
- node.js基于mongodb的搜索分頁示例
- NodeJS和BootStrap分頁效果的實(shí)現(xiàn)代碼
- nodejs分頁類代碼分享
- node+express實(shí)現(xiàn)分頁效果
相關(guān)文章
詳解nodejs實(shí)現(xiàn)本地上傳圖片并預(yù)覽功能(express4.0+)
本篇文章主要介紹了nodejs實(shí)現(xiàn)本地上傳圖片并預(yù)覽功能(express4.0+) ,具有一定的參考價(jià)值,有興趣的可以了解一下2017-06-06
對(duì)node.js中render和send的用法詳解
今天小編就為大家分享一篇對(duì)node.js中render和send的用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-05-05
Nodejs+angularjs結(jié)合multiparty實(shí)現(xiàn)多圖片上傳的示例代碼
這篇文章主要介紹了Nodejs+angularjs結(jié)合multiparty實(shí)現(xiàn)多圖片上傳的示例代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-09-09
nodejs使用express獲取get和post傳值及session驗(yàn)證的方法
這篇文章主要介紹了nodejs使用express獲取get和post傳值及session驗(yàn)證的方法,結(jié)合實(shí)例形式分析了nodejs使用express實(shí)現(xiàn)獲取get和post傳值及session驗(yàn)證功能的具體操作步驟與注意事項(xiàng),需要的朋友可以參考下2017-11-11
在Node.js中使用Express實(shí)現(xiàn)視頻評(píng)論的列表展示和刪除功能
在現(xiàn)代Web應(yīng)用中,視頻內(nèi)容和互動(dòng)功能(如評(píng)論)的結(jié)合極大地增加了用戶的參與度,本文將通過一個(gè)具體的例子,展示如何在Node.js環(huán)境中使用Express框架來實(shí)現(xiàn)視頻評(píng)論的列表展示和刪除功能,需要的朋友可以參考下2024-04-04
nodejs如何在package.json中設(shè)置多條啟動(dòng)命令
這篇文章主要介紹了nodejs如何在package.json中設(shè)置多條啟動(dòng)命令,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
nodejs轉(zhuǎn)換音頻文件格式并壓縮導(dǎo)出zip格式(vscode語音插件開發(fā))
FFmpeg是一套開源的音視頻處理工具,通俗地講,可以對(duì)音視頻文件進(jìn)行剪切、拼接、水印、轉(zhuǎn)碼等處理,這篇文章主要介紹了nodejs轉(zhuǎn)換音頻文件格式并壓縮導(dǎo)出zip格式(vscode語音插件開發(fā)),需要的朋友可以參考下2023-05-05

