鍍金池/ 問(wèn)答/數(shù)據(jù)庫(kù)  HTML/ mongo查詢(xún)時(shí),能否先統(tǒng)計(jì)數(shù)量,再獲取skip和limit后的值?

mongo查詢(xún)時(shí),能否先統(tǒng)計(jì)數(shù)量,再獲取skip和limit后的值?

因?yàn)榻?jīng)常要做分頁(yè), 所以需要用到 skip和limit來(lái)獲取當(dāng)前頁(yè)的值,
但是 在獲取總頁(yè)數(shù), 所以有沒(méi)有方式可以在一次查詢(xún)中獲取 總頁(yè)數(shù)和 當(dāng)前頁(yè)的值?

現(xiàn)在是 分兩次查詢(xún),結(jié)果再結(jié)合在一起。

1. count()
2. .skip(*).limit(*)
回答
編輯回答
乞許

我覺(jué)得樓上的兩種做法欠妥,因?yàn)?code>count的實(shí)現(xiàn)是這樣的

> db.tasks.count
function ( x ){
    return this.find( x ).count();
}

這是在mongodb的cli里面輸出的。
一句話(huà)概述就是count其實(shí)還是調(diào)用的find。
所以這種查兩次數(shù)據(jù)庫(kù)的方法我認(rèn)為是欠妥的。

2017年6月11日 19:15
編輯回答
陌南塵

樓上的表述基本正確。不過(guò)代碼還有可以?xún)?yōu)化的地方。countfind/skip/limit是典型的可以并行的運(yùn)算。上面的寫(xiě)法變成了查完一個(gè)再查另外一個(gè),有違nodejs的理念。改進(jìn)一下:

async function getPage(pageNo, pageSize, query) {
    result = await Promise.all([
        db.count(query),
        db.find(query).skip((pageNo - 1)*pageSize).limit(pageSize)
    ]);
    return {
        count: result[0],
        list: result[1]
    };
}
2017年12月23日 06:07
編輯回答
淚染裳

沒(méi)有一次查詢(xún)返回的,不過(guò)你可以將這兩個(gè)方法封裝一下,每次調(diào)用不就可以么?

async function getPage(pageNo, pageSize, query) {
    let count = await db.count(query);
    let list = await db.find(query).skip((pageNo - 1)*pageSize).limit(pageSize);
    return {
        count,
        list
    };
}
2018年3月4日 16:11