首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何过滤Node/MongoDB中的API数据?

如何过滤Node/MongoDB中的API数据?
EN

Stack Overflow用户
提问于 2018-12-04 03:45:34
回答 1查看 1.9K关注 0票数 1

我正在尝试写一个简单的API来从数据库中获取产品。我想通过给定的特定参数来过滤此数据,这些参数是可选的:

代码语言:javascript
运行
复制
router.get('/articles/:type?/:year?/:model?', api_controller.articles);

我的控制器看起来像这样:

代码语言:javascript
运行
复制
exports.articles = async (req, res, next) => {
const articles = await Article.find({
    'models': {
        $elemMatch: {
            'year': req.params.year,
            'category': req.params.type,
            'name': req.params.model,
        }
    }
});
res.send(articles);

}

但是,这只适用于具有3个参数的URL。如何通过查询无参数、单参数、多参数的API灵活地从数据库中获取数据?

EN

Stack Overflow用户

回答已采纳

发布于 2018-12-04 04:11:56

所以,你不能真的像那样做路由。“可选”路由参数的概念与路径参数不能很好地配合使用。例如,如果您想要指定模型,您需要输入类型和年份,而不能只搜索现有的模型。

如果您必须对路径执行此操作,则需要以与粒度相反的顺序定义三个路由:

代码语言:javascript
运行
复制
router.get('/articles/:type/:year/:model', api_controller.articles);
router.get('/articles/:type/:year', api_controller.articles);
router.get('/articles/:type', api_controller.articles);

我不确定你的查询是否正确,因为你没有共享你的数据结构,但一般来说,如果你尝试匹配null,mongodb会忽略参数,所以我认为你已经设置好了。

现在,如果是我,我根本不会在path上匹配。相反,我只使用查询字符串作为搜索参数,如下所示:

代码语言:javascript
运行
复制
router.get('/articles', api_controller.articles);

然后在控制器中:

代码语言:javascript
运行
复制
// now someone calls /articles?year=2017&type=whatever or could call /articles?model=some-name
exports.articles = async (req, res, next) => {
  const articles = await Article.find({
    'models': {
        $elemMatch: {
            'year': req.query.year,
            'category': req.query.type,
            'name': req.query.model,
        }
    }
  });
  res.send(articles);
}
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53600807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档