MongoDB查询$ and逐步返回与所有字段匹配的文档

时间:2020-08-30 05:11:53

标签: mongodb mongoose

我正在尝试查询一系列汽车。这是我的数据集的一个示例:

[
{
    "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中。我希望它不需要所有字段,而仅使用给出的字段进行搜索。

1 个答案:

答案 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'] }
    )

如果默认情况下要在查询中包含其他字段,则可以在首次声明时将其添加。