我有一个在线游戏store 和代码,可以通过标签和流派过滤数据.但我还想添加按平台和系统的过滤.例如,系统是PC,平台是Steam.我该如何实现这一点?

Schema

const mongoose = require("mongoose");
const slug = require('mongoose-slug-updater');
const options = {
    separator: "-",
    lang: "en",
    truncate: 120
}
mongoose.plugin(slug, options);
const GamesSchema = new mongoose.Schema({
    title: String,
    slug: { type: String, slug: ["title"], slugPaddingSize: 2, unique: true },
    last_url: String,
    description: String,
    preview: {
        src: String,
        alt: String
    },
    stock_price: String,
    discount: Number,
    total_price: String,
    system: Array,
    platform: String,
    info: {
        Genre: Array
    },
    tags: Array,
    config: Object,
    images: Array,
    keys: Array,
    content: String
})
module.exports = mongoose.model("Games", GamesSchema);

api controller

async get(req, res) {
        try {
            const page = parseInt(req.query.page) - 1 || 0;
            const limit = parseInt(req.query.limit) || 5;
            const search = req.query.search || '';
            let sort = req.query.sort || "top";
            let tags = req.query.tags || 'all';
            const tagsOpt = [];
            Games.find().then(async games => {
                games.forEach(game => {
                    game.tags.forEach(tag => {
                        if (!tagsOpt.includes(tag)) {
                            tagsOpt.push(tag)
                        }
                    })
                })

                tags === 'all' ? (tags = [...tagsOpt]) : (tags = req.query.tags.split(','));
                req.query.sort ? (sort = req.query.sort.split(',')) : (sort = [sort]);

                let sortBy = {};
                if (sort[1]) {
                    sortBy[sort[0] = sort[1]];
                } else {
                    sortBy[sort[0] = "top"]
                }
                const gamesData = await Games.find({ title: { $regex: search, $options: 'i' } })
                    .where('tags')
                    .in([...tags])
                    .sort(sortBy)
                    .skip(page * limit)
                    .limit(limit);

                const total = await Games.countDocuments({
                    tags: { $in: [...tags] },
                    title: { $regex: search, $options: 'i' },
                });
                const response = {
                    error: false,
                    total,
                    page: page + 1,
                    limit,
                    tags: tagsOpt,
                    gamesData
                };
                res.status(200).json(response);
            })
        } catch (error) {
            console.log(error);
            res.status(400).json({ message: 'Ошибка получения' })
        }
    }

我能够将流派和标签结合在一起并根据它们进行过滤,现在我真的需要将平台和系统都放入一组标签中吗?

推荐答案

不需要,您不需要将平台和系统都放入一组标签中.您可以分别按平台和系统进行过滤.

您可以在API中为平台和系统再添加两个查询参数,然后在您的Mongoose查询中使用它们.以下是你如何做到这一点:

async get(req, res) {
    try {
        const page = parseInt(req.query.page) - 1 || 0;
        const limit = parseInt(req.query.limit) || 5;
        const search = req.query.search || '';
        let sort = req.query.sort || "top";
        let tags = req.query.tags || 'all';
        const platform = req.query.platform || '';
        const system = req.query.system || '';
        const tagsOpt = [];
        Games.find().then(async games => {
            games.forEach(game => {
                game.tags.forEach(tag => {
                    if (!tagsOpt.includes(tag)) {
                        tagsOpt.push(tag)
                    }
                })
            })

            tags === 'all' ? (tags = [...tagsOpt]) : (tags = req.query.tags.split(','));
            req.query.sort ? (sort = req.query.sort.split(',')) : (sort = [sort]);

            let sortBy = {};
            if (sort[1]) {
                sortBy[sort[0] = sort[1]];
            } else {
                sortBy[sort[0] = "top"]
            }
            const gamesData = await Games.find({ 
                title: { $regex: search, $options: 'i' },
                platform: { $regex: platform, $options: 'i' },
                system: { $in: system.split(',') }
            })
                .where('tags')
                .in([...tags])
                .sort(sortBy)
                .skip(page * limit)
                .limit(limit);

            const total = await Games.countDocuments({
                tags: { $in: [...tags] },
                title: { $regex: search, $options: 'i' },
                platform: { $regex: platform, $options: 'i' },
                system: { $in: system.split(',') }
            });
            const response = {
                error: false,
                total,
                page: page + 1,
                limit,
                tags: tagsOpt,
                gamesData
            };
            res.status(200).json(response);
        })
    } catch (error) {
        console.log(error);
        res.status(400).json({ message: 'Ошибка получения' })
    }
}

在这段代码中,我添加了两个新的查询参数Platform和System.平台是一个字符串,系统是一个array.我使用$regex表示平台,使其不区分大小写,并使用$in表示系统与数组中的任何系统匹配.

现在,您可以通过在API请求中添加平台和系统参数来按平台和系统过滤游戏,如下所示:/api/Games?Platform=STeam&Amp;System=PC,Mac.

请用您的实际文件路径替换文件路径.

Javascript相关问答推荐

如何使用CSS和JavaScript创建粘性、凝聚力的形状到形状(容器)变形?

Next.js Next/Image图像隐含性有任何类型-如何修复?

我应该在redux reducer中调用其他reducer函数吗?

从Node JS将对象数组中的数据插入Postgres表

实现JS代码更改CSS元素

我怎么才能得到Kotlin的密文?

如何在ASP.NET JavaScript中使用Google Charts API仅对绘制为负方向的条形图移动堆叠条形图标签位置

未定义引用错误:未定义&Quot;而不是&Quot;ReferenceError:在初始化&Quot;之前无法访问';a';

使用领域Web SDK的Vite+Vue应用程序中的Web程序集(WASM)错误

本地库中的chartjs-4.4.2和chartjs-plugin-注解

400 bad request error posting through node-fetch

如何将zoom 变换应用到我的d3力有向图?

Reaction Redux&Quot;在派单错误中检测到状态Mutations

如何在JAVASCRIPT中临时删除eventListener?

搜索功能不是在分页的每一页上进行搜索

以编程方式聚焦的链接将被聚焦,但样式不适用

如何在Press上重新启动EXPO-AV视频?

令牌JWT未过期

将范围 Select 器添加到HighChart面积图

使用线性插值法旋转直线以查看鼠标会导致 skip