Как вернуть все записи, присутствующие в MongoDb, если запрос равен нулю? - PullRequest
1 голос
/ 20 июня 2020

У меня следующая конечная точка по умолчанию возвращает все курсы, найденные в Db. Я хочу изменить его так, чтобы, когда req.query.class пуст, он возвращал все записи, в противном случае возвращал записи условно.

router.get('/allcourses', checkAuth, (req, res) => {
    const studentclass = req.query.class;
    Course.find().select({ coursename: 1 }).select({ class: 1 }).select({ board: 1 }).select({ coursedescription: 1 }).then((data) => {
        res.status(200).json({
            courses: data
        })
    }).catch((err) => {
        console.log(err)
        return res.status(503).json({
            message: 'Cannot retreive courses at this moment, try again later!'
        })
    })
})

Я не могу понять, как использовать переменную studentclass.

Если Я делаю Course.find({class:studentclass}).select({ coursename: 1 }).select({ class: 1 }).select({ board: 1 }).select({ coursedescription: 1 }), он возвращает пустой, когда req.query.class пуст (конечно).

Ответы [ 2 ]

2 голосов
/ 20 июня 2020

Просто определите пустой объект filter и установите свойство class в зависимости от наличия переменной req.query.class:

const filter = {};
if(req.query.class) {
    filter.class = req.query.class;
}

Course.find(filter).select(...)

Обратите внимание, что это не приведет к установке class в фильтре если req.query.class вернул пустую строку (например, "") из-за истинной оценки строки JavaScript. Если вы хотите установить фильтр в этом случае, вам необходимо явно проверить, не является ли значение undefined:

if(typeof req.query.class !== 'undefined') { ... }
1 голос
/ 20 июня 2020

Мы можем построить запрос, отфильтровав неопределенные свойства, это будет работать, когда в запросе также есть несколько полей

const omitUndefined = (obj = {}) => Object.entries(obj)
  .reduce((result, [key, value]) => 
    ({ ...result, ...(typeof value !== "undefined" && { [key]: value }) }) ,
  {})

Course.find(omitUndefined({ class: req.query.class })).select(...)
/*
This will work for multiple fields, if all fields are undefined you will end up with an empty query object
Course.find(omitUndefined({ class: req.query.class, board: req.query.board })).select(...)
*/
...