Игнорировать неопределенные значения, которые передаются в параметре объекта запроса для функции поиска Mongoose? - PullRequest
0 голосов
/ 31 октября 2018

Итак:

Sound.find({
  what: req.query.what,
  where: req.query.where,
  date: req.query.date,
  hour: req.query.hour}, function(err, varToStoreResult, count) {
  //stuff
});

Скажите, что только req.query.what имеет фактическое значение, например, "да", тогда как остальные (req.query.where, req.query.date и т. Д.) Все не определены / пусты. Если я оставлю этот код как есть, он будет искать документы, которые имеют what = req.query.what AND where = req.query.where и т. Д., Но я бы только хотел, чтобы он нашел документы, которые имеют их what значение = req .query.what, так как остальные поля не определены / пусты.

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Вы можете использовать простое снижение на Object.entries

const req = {query: {a: 1,b: undefined,c: 2}}

const query = Object.entries(req.query).reduce((a, [k, v]) => {
  if (v !== undefined) {
    a[k] = v;
  }
  return a
}, {});

console.log(query)
0 голосов
/ 31 октября 2018

Вы должны сначала отфильтровать объект res.query по неопределенным / пустым значениям, а затем передать его в функцию find. Если у вас есть только несколько свойств, вы можете использовать оператор if:

const query = req.query;
const conditions = {};

if (query.what) {
  conditions.what = query.what;
}

if (query.where) {
  conditions.where = query.where;
}

....


Sound.find(conditions, function () {});

Или, если есть много свойств, вы можете перебирать их:

const query = req.query;
const conditions = Object.keys(query)
  .reduce((result, key) => {
    if (query[key]) {
      result[key] = query[key];
    }
    return result;
}, {}); 

Sound.find(conditions, function () {});

Кроме того, я бы не советовал удалять свойства из фактического res.query объекта - delete res.query.what - потому что вы не сможете использовать его в другом промежуточном программном обеспечении, если захотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...