【问题标题】:implement pagination REST API using mongoDB and express.js使用 mongoDB 和 express.js 实现分页 REST API
【发布时间】:2021-06-21 15:14:20
【问题描述】:

我有四个收藏mixed, organic, upcycle, vegan 这些都有相同的字段:

// scheme
    const productsSchema = new Schema({
        _id: Schema.Types.ObjectId,
        kind: {
            "upcycle": Boolean,
            "organic": Boolean,
            "vegan": Boolean
        },
        koLCategory: String,
        enLCategory: String,
        sCategory: String,
        koBrandName: String,
        enBrandName: String,
        productName: String,
        thumbNail: String,
        originPrice: String,
        discountPrice: String,
        url: String,
        soldout: Boolean
    });

    const mixedModel = products_conn.model('products', productsSchema, 'mixed');
    const organicModel = products_conn.model('products', productsSchema, 'organic');
    const upcycleModel = products_conn.model('products', productsSchema, 'upcycle');
    const veganModel = products_conn.model('products', productsSchema, 'vegan');

    module.exports = {
        mixedModel,
        organicModel,
        upcycleModel,
        veganModel
    };

我想做的是制作分页 REST API。 这段代码只是实现了 REST API(不是分页)

router.route('/category/outer/all').get((req, res) => {
    const upcycle = upcycleModel.aggregate([
        {"$match": {"soldout": false, "koLCategory": "keyword"}},
        {"$project":
            {
                "_id": 0,
                "soldout": 0,
            }
        }
    ]);
    const organic = organicModel.aggregate([
        {"$match": {"soldout": false, "koLCategory": "keyword"}},
        {"$project":
            {
                "_id": 0,
                "soldout": 0,
            }
        }
    ]);
    const vegan = veganModel.aggregate([
        {"$match": {"soldout": false, "koLCategory": "keyword"}},
        {"$project":
            {
                "_id": 0,
                "soldout": 0,
            }
        }
    ]);
    const mixed = mixedModel.aggregate([
        {"$match": {"soldout": false, "koLCategory": "keyword"}},
        {"$project":
            {
                "_id": 0,
                "soldout": 0,
            }
        }
    ]);
    Promise.all([
        upcycle,
        organic,
        vegan,
        mixed
    ]).then(data => res.json({
            product: {
                totalCnt: data[0].length + data[1].length + data[2].length + data[3].length,
                items: data[0].concat(data[1]).concat(data[2]).concat(data[3])
            }
        })).catch(err => res.status(400).json('Error: ' + err));
});

在这种情况下,如何生成 REST API 分页?
我知道,将所有数据推送到一个集合中并仅使用 skip, limit 非常简单。
但为了更有效地管理数据,我根据类别值分离集合。
除了将所有数据推送到一个集合中之外,还有其他解决方案吗?

【问题讨论】:

    标签: mongodb express pagination


    【解决方案1】:

    我自己解决了这个问题, 代码是:

    router.route('/category/outer/all/:page').get((req, res) => {
        const upcycle = upcycleModel.aggregate([
            {"$match": {"soldout": false, "koLCategory": "keyword"}},
            {"$project":
                {
                    "_id": 0,
                    "soldout": 0,
                }
            }
        ]);
        const organic = organicModel.aggregate([
            {"$match": {"soldout": false, "koLCategory": "keyword"}},
            {"$project":
                {
                    "_id": 0,
                    "soldout": 0,
                }
            }
        ]);
        const vegan = veganModel.aggregate([
            {"$match": {"soldout": false, "koLCategory": "keyword"}},
            {"$project":
                {
                    "_id": 0,
                    "soldout": 0,
                }
            }
        ]);
        const mixed = mixedModel.aggregate([
            {"$match": {"soldout": false, "koLCategory": "keyword"}},
            {"$project":
                {
                    "_id": 0,
                    "soldout": 0,
                }
            }
        ]);
        /* this part */
        const page = req.params.page;
        const limit = 30;
        const startIndex = (page - 1) * limit;
        const endIndex = page * limit;
        Promise.all([
            upcycle,
            organic,
            vegan,
            mixed
        ]).then(data => {
            result = data[0].concat(data[1]).concat(data[2]).concat(data[3]).slice(startIndex, endIndex);
            res.json({
                product: {
                    totalCnt: result.length,
                    items: result
                }
            })
        }).catch(err => res.status(400).json('Error: ' + err));
    });
    

    如果你有更高效的解决方案,请留下cmets。

    【讨论】:

      猜你喜欢
      • 2020-08-12
      • 1970-01-01
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 1970-01-01
      相关资源
      最近更新 更多