Estoy tratando de consultar una variedad de autos. Este es un ejemplo de mi conjunto de datos:

[
{
    "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",
    ...
}
]

Esta es mi consulta:

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

Esta consulta usa un $ implícito y eso no es lo que quiero hacer. Quiero devolver todos los documentos que satisfagan una o más de las consultas pero también que tengan en cuenta todas las consultas. Por tanto, si busco "modelo 1", devolverá todos los coches que se denominan "modelo 1" y si busco "modelo 1" y "negro", debería devolver todos los coches que se denominan "modelo 1" y son de el color "negro" (NO todo el "modelo 1" Y todo el color "negro").

Además, de la forma en que lo estoy haciendo en este momento, todos los campos deben existir en mi cuerpo req. Me gustaría que no requiera todos los campos, solo busque con los campos que se proporcionan.

0
Windbox 30 ago. 2020 a las 08:11

1 respuesta

La mejor respuesta

En su punto final, querrá construir el objeto de consulta antes de realizar la llamada a paginate(). De esta manera, puede verificar ciertos campos en el cuerpo de la solicitud para determinar si deben agregarse. Podría verse así:

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');
}

De esta forma, la consulta solo contendrá campos en el cuerpo de la solicitud. Luego pasaría query a paginate() así:

Car.paginate(
      query,
      { offset, limit, sort: getSort(req.query.sortType), populate: ['car'] }
    )

Si hay otros campos que desea incluir en la consulta de forma predeterminada, puede agregarlos cuando se declare por primera vez.

1
Montgomery Watts 30 ago. 2020 a las 06:48