1
resposta

Uma Contribuição - Versão Mongoose 7.1.0

Pelomenos na versão do mongoose descrita no título (7.1.0), é possível usar o objeto req.query diretamente como filtro, de forma que mais de um critério possa ser passado. Vou exemplificar:

Tendo a seguinte lista:

[
    {
        "_id": "645583df6d381063e06c8c13",
        "title": "Lógica de Programação - I",
        "author": {
            "_id": "6455836b6d381063e06c8c0f",
            "name": "Victor Krum",
            "nationality": "Brazilian"
        },
        "publishing_company": "MIT",
        "pages": 250,
        "__v": 0
    },
    {
        "_id": "645586a3a125992c213f8560",
        "title": "Lógica de Programação - II",
        "author": {
            "_id": "645583656d381063e06c8c0d",
            "name": "Emilly Krum",
            "nationality": "Brazilian"
        },
        "publishing_company": "FIPP",
        "pages": 200,
        "__v": 0
    },
    {
        "_id": "64559185090009459ba36168",
        "title": "Lógica de Programação - III",
        "author": {
            "_id": "645583656d381063e06c8c0d",
            "name": "Emilly Krum",
            "nationality": "Brazilian"
        },
        "publishing_company": "FIPP",
        "pages": 223,
        "__v": 0
    },
    {
        "_id": "64559227fba3542a983b7d1a",
        "title": "Algoritimos e Técnicas de Programação - I",
        "author": {
            "_id": "645583656d381063e06c8c0d",
            "name": "Emilly Krum",
            "nationality": "Brazilian"
        },
        "publishing_company": "MIT",
        "pages": 200,
        "__v": 0
    },
    {
        "_id": "64559297387fb72ea6159dd4",
        "title": "Algoritimos e Técnicas de Programação - II",
        "author": {
            "_id": "645583656d381063e06c8c0d",
            "name": "Emilly Krum",
            "nationality": "Brazilian"
        },
        "publishing_company": "MIT",
        "pages": 210,
        "__v": 0
    },
    {
        "_id": "645592a0387fb72ea6159dd6",
        "title": "Algoritimos e Técnicas de Programação - III",
        "author": {
            "_id": "645583656d381063e06c8c0d",
            "name": "Emilly Krum",
            "nationality": "Brazilian"
        },
        "publishing_company": "MIT",
        "pages": 220,
        "__v": 0
    },
    {
        "_id": "645592a1387fb72ea6159dd8",
        "title": "Estruturas de Dados - I",
        "author": {
            "_id": "645583656d381063e06c8c0d",
            "name": "Emilly Krum",
            "nationality": "Brazilian"
        },
        "publishing_company": "MIT",
        "pages": 200,
        "__v": 0
    }
]

Então querendo nós, filtrar todos os livros que tem publishing_company como MIT e tem 200 páginas:

  • A query string:

      http://localhost:3000/books?publishing_company=MIT&pages=200
  • O objeto ReqQuery do Express:

      console.log(req.query);
      /* saída: 
    
          { publishing_company: 'MIT', pages: '200' }
      */
  • O resultado:

      [
          {
              "_id": "64559227fba3542a983b7d1a",
              "title": "Algoritimos e Técnicas de Programação - I",
              "author": {
                  "_id": "645583656d381063e06c8c0d",
                  "name": "Emilly Krum",
                  "nationality": "Brazilian"
              },
              "publishing_company": "MIT",
              "pages": 200,
              "__v": 0
          },
          {
              "_id": "645592a1387fb72ea6159dd8",
              "title": "Estruturas de Dados - I",
              "author": {
                  "_id": "645583656d381063e06c8c0d",
                  "name": "Emilly Krum",
                  "nationality": "Brazilian"
              },
              "publishing_company": "MIT",
              "pages": 200,
              "__v": 0
          }
      ]

Querendo nós todos os com a editora FIPP

  • A query string:

      http://localhost:3000/books?publishing_company=FIPP
  • O objeto ReqQuery do Express:

      console.log(req.query);
      /* saída: 
    
          { publishing_company: 'FIPP' }
      */
  • O resultado:

      [
          {
              "_id": "645586a3a125992c213f8560",
              "title": "Lógica de Programação - II",
              "author": {
                  "_id": "645583656d381063e06c8c0d",
                  "name": "Emilly Krum",
                  "nationality": "Brazilian"
              },
              "publishing_company": "FIPP",
              "pages": 200,
              "__v": 0
          },
          {
              "_id": "64559185090009459ba36168",
              "title": "Lógica de Programação - III",
              "author": {
                  "_id": "645583656d381063e06c8c0d",
                  "name": "Emilly Krum",
                  "nationality": "Brazilian"
              },
              "publishing_company": "FIPP",
              "pages": 223,
              "__v": 0
          }
      ]
      [...] //outros resultados

Código:

static async list(req, res) {
    try {
        console.log(req.query);
        const list = await BookModel.find(req.query).populate('author');
        res.status(200).json(list);
    } catch (error) {
        res.status(500).json({ error: error });
    }
}

Observações

  1. O código da forma que está, busca somente valores exatos, ou seja, não encontra FIPP_IND como valor de publishing_company.
  2. Se passar algum parâmetro na query string que não exista no modelo, exemplo is_active, nenhum resultado será retornado.
  3. Nessa versão, o método exec() não se mostrou necessário.
  4. se passar a query string com algum campo com a caixa alta, diferente do atributo no modelo, exemplo: http://localhost:3000/books?publishing_company=MIT&PAGES=200 com PAGES em maiúsculo, zero registros serão retornados.
1 resposta

Olá Victor, tudo bem?

Obrigado por compartilhar essa informação conosco!

Realmente, é possível usar o objeto req.query diretamente como filtro na versão 7.1.0 do Mongoose. Seu exemplo foi muito útil para entendermos como funciona na prática.