node.js - 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§or=&industry=
我发现了一些与我的问题有些相似的其他线程,但它们不同,可以帮助我解决我的问题。
期待您的有益建议。
解决方案
我终于让它工作了。原来我没有在每次更改时清除前端中的数据,这导致了跳过/限制字段的问题。
我还按照@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)] } },
}
],
})
推荐阅读
- javascript - 如何使用 jQuery 进行 AJAX 调用?
- tkinter - tkinter - Visual Studio代码调试和命令行之间的字体不一致
- c# - 帮我修复我的代码无法将其从 java 转换为 c#
- c# - 如何使用匿名类型进行分组
- python-3.x - 如何从两个字符串中生成最短的字符串
- mysql - 如何修复 SSIS 中的 ODBC Driver 8.0 SQL 语法错误?
- python - 如何从网络链接收集数据和下载文件
- php - 类型:ParseError 消息:语法错误,意外的 '?>'
- for-loop - 在第一个间隔之前优雅地运行 Ticker 的身体?
- python - Pandas 从 Int64Index 转换为 RangeIndex