首页 > 解决方案 > Mongoose 多个可选的“和”条件

问题描述

我正在尝试使用 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'
})

我得到了我想要的数据。

我还尝试在 getCompanies 中 console.log 过滤器以确保数据正确,如果请求了所有字段,我会得到这个:

{
  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 } },
  })

但也没有运气。

这是一个示例网址:

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

我发现了一些与我的问题有些相似的其他线程,但它们不同,可以帮助我解决我的问题。

期待您的有益建议。

标签: node.jsmongodbexpressmongoose

解决方案


我终于让它工作了。原来我没有在每次更改时清除前端中的数据,这导致了跳过/限制字段的问题。

我还按照@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)] } },
    }
  ],
  })

推荐阅读