Пн goose несколько дополнительных 'и' условия - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь отфильтровать коллекцию с 3 дополнительными условиями 'и'.

Вот моя модель:

const Company = mongoose.model(
  'Company',
  new Schema({
    name: { type: String },
    sectors: [{ type: Schema.Types.ObjectId, ref: 'Sector' }],
    industries: [{ type: Schema.Types.ObjectId, ref: 'Industry' }],
    countries: [{ type: Schema.Types.ObjectId, ref: 'Country' }],   
  })

И мой компонент:

const getCompanies = (skip, limit, filter) =>
  Company.find({
    ...filter.countries && { countries: filter.countries },
    ...filter.sectors && { sectors: filter.sectors },
    ...filter.industries && { industries: filter.industries },
 })
.skip(skip)
.limit(limit)
.sort({ date: -1 })
.populate('countries')
.populate('sectors')
.populate('industries');


const getAll = async (req, res) => {
 try {
  const countries = req.query.country;
  const sectors = req.query.sector;
  const industries = req.query.industry;
  const skip = parseInt(req.query.skip, 10);
  const limit = parseInt(req.query.limit, 10);
  const filter = {
    ...countries && { countries },
    ...sectors && { sectors },
    ...industries && { industries },
  };
  const result = await getCompanies(skip, limit, filter);
  return res.status(200).json(result);
} catch (e) {
  return res.status(500).send({ message: (e.message) });
}
};

Это работает, когда фильтр пуст, но когда в фильтре есть один или несколько элементов, я получаю пустой массив.

Если я жестко кодирую данные в getCompanies примерно так:

Company.find({
  countries: '5d5e913e20c01070fef5c77e',
  sectors: '5d5e913e20c01070fef5c754',
  industries: '5d5e913e20c01070fef5c7ad',
})

или:

Company.find({
  countries: '5d5e913e20c01070fef5c77e'
})

Я получаю нужные данные.

Я также попытался console.log фильтра в getCompanies, чтобы убедиться, что данные были правильными, и я получаю это если запрошены все поля:

{
  countries: '5d5e913e20c01070fef5c77e',
  sectors: '5d5e913e20c01070fef5c754',
  industries: '5d5e913e20c01070fef5c7ad',
}

и это только для одного:

{ countries: '5d5e913e20c01070fef5c77e' }

Так что мне кажется, что это нормально.

Я также пытался использовать '$ and 'вот так:

Company.find({ $and: [
    { ...filter.countries && { countries: filter.countries } },
    { ...filter.sectors && { sectors: filter.sectors } },
    { ...filter.industries && {industries: filter.industries } },
  ],
  })

или используя' $ in ':

Company.find({
    ...filter.countries && { countries: { $in: filter.countries } },
    ...filter.sectors && { sectors: { $in: filter.sectors } },
    ...filter.industries && { industries: { $in: filter.industries } },
  })

Но не повезло.

Вот пример URL:

GET /api/internal/member/get?skip=12&limit=6&country=5d5e913e20c01070fef5c77e&sector=&industry=

Я нашел некоторые другие темы с вопросами, несколько похожими на мои, но они отличались, чтобы помочь мне решить мое дело.

С нетерпением ждем вашего полезного совета.

1 Ответ

0 голосов
/ 17 марта 2020

Я наконец получил его на работу. Оказывается, я не очищал данные во внешнем интерфейсе при каждом изменении, что вызывало проблему с полями пропуска / лимита.

Я также изменил поиск в соответствии с рекомендациями @whoami следующим образом:

Company.find({ $and: [
    {
      ...filter.countries && { countries: { $in: [mongoose.Types.ObjectId(filter.countries)] } },
      ...filter.sectors && { sectors: { $in: [mongoose.Types.ObjectId(filter.sectors)] } },
      ...filter.sdgs && { sdgs: { $in: [mongoose.Types.ObjectId(filter.sdgs)] } },
    }
  ],
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...