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

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

因為經(jīng)常要做分頁, 所以需要用到 skip和limit來獲取當前頁的值,
但是 在獲取總頁數(shù), 所以有沒有方式可以在一次查詢中獲取 總頁數(shù)和 當前頁的值?

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

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

我覺得樓上的兩種做法欠妥,因為count的實現(xiàn)是這樣的

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

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

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

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

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
編輯回答
淚染裳

沒有一次查詢返回的,不過你可以將這兩個方法封裝一下,每次調用不就可以么?

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