我正在尝试查询一系列汽车。这是我的数据集的一个示例:
[
{
"model": "Model 3",
"location": "Canada",
"color": "green",
"engine": "1.4 turbo",
"gearbox": "automatic",
...
},
{
"model": "Model 4",
"location": "Brazil",
"color": "green",
"engine": "1.4 turbo",
"gearbox": "automatic",
...
}
]
这是我的查询:
Car.paginate(
{
model: new RegExp(`^${req.body.model}$`, 'i'),
color: new RegExp(`^${req.body.color}$`, 'i'),
...
},
{ offset, limit, sort: getSort(req.query.sortType), populate: ['car'] }
)
此查询使用隐式$,但这不是我想要的。我想返回所有满足一个或多个查询但又考虑到所有查询的文档。因此,如果我搜索“模型1”,它将返回所有名为“模型1”的汽车;如果我搜索“模型1”和“黑色”,则应返回所有名为“模型1”的汽车颜色为“黑色”(并非全部为“模型1”,也并非全部为“黑色”)。
此外,按照我现在的方式,所有字段都必须存在于我的req.body中。我希望它不需要所有字段,而仅使用给出的字段进行搜索。
答案 0 :(得分:1)
在端点中,您需要先构建查询对象,然后再调用paginate()
。这样,您可以检查请求正文中的某些字段,以确定是否应添加它们。可能看起来像这样:
var query = {};
if (req.body.model) {
query.model = new RegExp(`^${req.body.model}$`, 'i');
}
if (req.body.color) {
query.color = new RegExp(`^${req.body.color}$`, 'i');
}
这样,查询将仅在请求正文中包含字段。然后,您需要像这样将query
传递给paginate()
:
Car.paginate(
query,
{ offset, limit, sort: getSort(req.query.sortType), populate: ['car'] }
)
如果默认情况下要在查询中包含其他字段,则可以在首次声明时将其添加。