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
- O código da forma que está, busca somente valores exatos, ou seja, não encontra FIPP_IND como valor de publishing_company.
- Se passar algum parâmetro na query string que não exista no modelo, exemplo
is_active
, nenhum resultado será retornado. - Nessa versão, o método
exec()
não se mostrou necessário. - 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.