Я пытаюсь отфильтровать коллекцию с 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§or=&industry=
Я нашел некоторые другие темы с вопросами, несколько похожими на мои, но они отличались, чтобы помочь мне решить мое дело.
С нетерпением ждем вашего полезного совета.