Как фильтровать данные для API в Node / MongoDB? - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь написать простой API для получения продуктов из базы данных.Я хочу отфильтровать эти данные по заданным параметрам, которые являются необязательными:

router.get('/articles/:type?/:year?/:model?', api_controller.articles);

Мой контроллер выглядит следующим образом:

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);

}

Однако это работает толькодля URL с 3 параметрами.Как гибко получать данные из базы данных, запрашивая API без параметров, с одним параметром и несколькими параметрами?

1 Ответ

0 голосов
/ 03 декабря 2018

Итак, вы не можете делать маршрутизацию именно так.Концепция «необязательных» параметров маршрута плохо работает с параметрами пути.Например, вы не можете осуществлять поиск только по той модели, которая у вас есть, если вы хотите указать модель, которую вам необходимо указать тип и год, вам наверняка нужно.

Если вы должны сделать это с путем, то вам нужно определить три маршрута в обратном порядке детализации:

router.get('/articles/:type/:year/:model', api_controller.articles);
router.get('/articles/:type/:year', api_controller.articles);
router.get('/articles/:type', api_controller.articles);

Не уверен, что ваш запрос правильный, так как вы не сделали 'Я не могу поделиться своей структурой данных, но в целом, если вы попытаетесь найти совпадение на нуле, mongodb проигнорирует этот параметр, так что я думаю, что вы настроили его.

Теперь, если бы это был я, я бы вообще не подходил по пути.Вместо этого я бы просто использовал строку запроса для параметров поиска, например:

router.get('/articles', api_controller.articles);

Затем в контроллере:

// 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...