5
respostas

Busca de livro por editora

Como eu faço para fazer a busca de livro por editora, sendo que minha editora é uma coleção? Eu fiz os mesmos passos do modelo do Autor, e consegui fazer tudo direitinho, tanto que quando eu utilizo o recurso listarLivros, eu consigo ver a editora:

[
    {
        "_id": "623cb86acaa895cfcbeb07af",
        "titulo": "Back-end JavaScript",
        "autor": {
            "_id": "623cd00ee4bd56ea597a2f84",
            "nome": "Gustavo Meireles Lessa",
            "nacionalidade": "Brasileiro"
        },
        "editora": {
            "_id": "623dc01753fbf8a2cfb03577",
            "nome": "Casa",
            "cnpj": "12345678000180"
        },
        "numeroPaginas": 100,
        "__v": 0
    }
]

Mas quando eu faço a query no Postman http://localhost:4000/livros/busca/?editora=Casa, eu recebo um retorno em branco. Imagino que seja porque a query da função listarLivroPorEditora está errada, mas não sei como consertar. Podem me ajudar?


    static listarLivroPorEditora = (req, res) => {
        const editora = req.query.editora

        livros.find({'editora': editora}, {}, (err, livros) => {
            res.status(200).send(livros);
        })
    }
5 respostas

Consegui resolver!

    static listarLivroPorEditora = (req, res) => {
        const editora = req.query.editora
                    //alterar editora para nome
        livros.find({'nome': editora})
        //populate para visualizar as informações dos autores e editoras
        .populate('autor', 'nome')
        .populate('editora', 'nome')
        .exec((err, livros) => {
            res.status(200).send(livros);
        })
    }

Fazendo a requisção http://localhost:4000/livros/busca/?editora=Casa , este é o retorno: OBS: Se não utilizar o .populate, a query só retorna o id da editora e do autor.

[
    {
        "_id": "623cb86acaa895cfcbeb07af",
        "titulo": "Back-end JavaScript",
        "autor": {
            "_id": "623cd00ee4bd56ea597a2f84",
            "nome": "Gustavo Meireles Lessa"
        },
        "editora": {
            "_id": "623dc01753fbf8a2cfb03577",
            "nome": "Casa"
        },
        "numeroPaginas": 100,
        "__v": 0
    },
    {
        "_id": "623dc9ad45553a39314fe0a2",
        "titulo": "Front-end JavaScript",
        "autor": {
            "_id": "623dc98645553a39314fe0a0",
            "nome": "Suzana Medeiros Diniz Araújo"
        },
        "editora": {
            "_id": "623dc01753fbf8a2cfb03577",
            "nome": "Casa"
        },
        "numeroPaginas": 150,
        "__v": 0
    }
]

Cuidado, seu código tem um caso em que pode dar problema.

Caso o nome do autor seja igual a query que vc esta utilizando, ele volta na sua consulta, independente do nome da editora. Isso acontece porque não há especifidade suficiente no nome da propriedade que vc esta procurando. Nesses casos, é melhor mudar o nome da propriedade no modelo para algo como 'nomeEditora'e 'nomeAutor'.

Na verdade, percebi que o código retorna todos os livros independente do nome que eu coloque mesmo com a alteração no nome dos campos.

    static listarLivroPorEditora = (req, res) => {
        const editora = req.query.editora

        livros.find({'nomeEditora':editora})
        .populate('autor', 'nomeAutor')
        .populate('editora', 'nomeEditora')
        .exec((err, livros) => {
            res.status(200).send(livros);
        })
    }

Utilizando a Query:

http://localhost:4000/livros/busca/?nomeEditora=Casa

Retorna:

[
    {
        "_id": "6241b3a1903cf06b15e6e656",
        "titulo": "Java",
        "autor": {
            "_id": "6241b374903cf06b15e6e650",
            "nomeAutor": "Gustavo Meireles"
        },
        "editora": {
            "_id": "6241b364903cf06b15e6e64e",
            "nomeEditora": "Casa"
        },
        "numeroPaginas": 500,
        "__v": 0
    },
    {
        "_id": "6241b3cb903cf06b15e6e658",
        "titulo": "Blockchain",
        "autor": {
            "_id": "6241b37e903cf06b15e6e652",
            "nomeAutor": "Diogo Teixeira"
        },
        "editora": {
            "_id": "6241b355903cf06b15e6e64c",
            "nomeEditora": "Teixeira Livrarias"
        },
        "numeroPaginas": 500,
        "__v": 0
    }
]

Alguma ideia de como consertar?

Olá!

Eu estou com o mesmo problema do Gustavo e meu código está semelhante também, testei algumas possibilidades mas ainda não consegui resolver também.

A busca continua retornando todos os livros.

Pelo que eu entendi, quando definimos no Schema que um atributo tem o type ObjectId, precisamos passar o id que faz referência a esse atributo para acessá-lo, porque ele vem de uma coleção.

No nosso caso, editoras agora é uma coleção distinta de livros. E da mesma forma que passamos o id de um livro para acessá-lo, ao buscar livros por editora, temos que passar o id que faz referência a essa editora lá na coleção editoras.

Então ao invés de: /livros/busca?editora=Nome da Editora

fazemos: /livros/busca?editora=idDoObjetoEditora