Mongoose - 第一次自定义跳过和限制

时间:2017-10-25 10:18:43

标签: node.js mongodb api mongoose

我有点陷入困境。我真的想要一个简单的查询。我想计算来自查询查询的所有结果,然后我想应用跳过和限制但不是第一次。简单来说,我首先想要所有物品及其数量。基于此我想在结果上应用跳过和限制。我怎么能实现这一点我被卡住了。我尝试了不同的东西,比如将第一个查询结果存储在变量中并应用find() limit() skip()但它不起作用。

样品 这是我到目前为止所做的。

Product.find({
        'category.category_name': request
    },
    function (err, searchedResults) {
        if (err) {
            return res.status(500).send("There was a problem getting the category based record .");

        } else {
            //Assign searched results length as product Count
            productCount = searchedResults.length;

            // apply ceiling - to make total pages
            totalPages = Math.ceil(productCount / pageOptions.limit);

            // tell the pagination what is the kind of pagination
            kindOfPagination = 'searchProduct';

            // call pagination func
            pagination(productCount, totalPages, pageOptions.page, pageOptions.limit, kindOfPagination);

            res.status(200).json({
                'products': searchedResults,
                '_meta': _meta
            });
        }
    })

现在我需要应用skiplimit部分。喜欢这个

跳过并限制

 Product.find().skip(pageOptions.page * pageOptions.limit)
    .limit(parseInt(pageOptions.limit))
    .exec('find', function (err, products) {
        if (err) {
            res.status(500).json(err);
            return;
        } else {
            res.status(200).json({
                'products': products, // consuming the product variable
                '_meta': _meta
            });
        }
    });

现在在skiplimit我希望应用从样本返回的结果。我怎样才能做到这一点 ?我以前试过这个。

我尝试了什么

    Product.find({
            'category.category_name': request
        }).skip(req.query.page * 10)
        .limit(parseInt(10))
        .exec('find', function (err, searchedResults) {
            if (err) {
                return res.status(500).send("There was a problem getting the category based record .");

            } else {
                pageOptionsFunc(req.query.page);

                //Assign searched results length as product Count
                productCount = searchedResults.length;

                // apply ceiling - to make total pages
                totalPages = Math.ceil(productCount / pageOptions.limit);

                // tell the pagination what is the kind of pagination
                kindOfPagination = 'searchProduct';

                // call pagination func
                pagination(productCount, totalPages, pageOptions.page, pageOptions.limit, kindOfPagination);

// I am storing the results in a searchResultsSample
 searchResultsSample  = searchedResults;

                res.status(200).json({
                    'products': searchedResults,
                    '_meta': _meta
                });
            }
        })

请参阅searchResultsSample。现在我使用它skiplimit部分。喜欢这个

searchResultsSample.find().skip(pageOptions.page * pageOptions.limit)
    .limit(parseInt(pageOptions.limit))
    .exec('find', function (err, products) {
        if (err) {
            res.status(500).json(err);
            return;
        } else {
            res.status(200).json({
                'products': products, // consuming the product variable
                '_meta': _meta
            });
        }
    });

但它没有用,我得到了一个未定义的错误函数。我怎样才能做到这一点 ?

1 个答案:

答案 0 :(得分:1)

首先计算,然后应用跳过和限制。

router.get('/products', function (req, res) {

    let items_perpage = req.query.itemsperpage || 5;
    let page = req.query.page || 1;

    let skip = items_perpage * (page - 1);
    let limit = parseInt(items_perpage);

    Product.find({'category.category_name': request}).count(function (err, totalCount) {
        if (err) {
            logger.error(err.stack);
            return res.status(500).send({ success: false, msg: 'Internal Server Error' })
        }
        else {
            Product.find({
                'category.category_name': request
            }).skip(skip).limit(limit).exec(function (err, searchedResults) {
                if (err) {
                    logger.error(err.stack);
                    return res.status(500).send({ success: false, msg: 'Internal Server Error' })
                }
                else {
                    let total = {}
                    total.count = totalCount;
                    if (total.count % items_perpage == 0) {
                        total.pages = (total.count / items_perpage);
                    }
                    else {
                        total.pages = (parseInt(total.count / items_perpage) + 1);
                    }
                    return res.status(200).send({ success: true, msg: 'All Products', total: total, data: searchedResults });
                }
            });
        }
    })
});