Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

[Dúvida] findByIdAndUpdate() retorna sucesso, mas não altera o banco

Pessoal,

Preciso de ajuda para usar o metodo 'findByIdAndUpdate()' e substituir a callback usada durante o curso para fazer o PUT. Com o código abaixo, eu obtenho status 200 e a mensagem de sucesso, mas o banco não atualiza o campo especificado.

    static atualizarLivro = async (req, res) => {
        const id = req.params.id;
        try {
            livros.findByIdAndUpdate(id, {$set: req.body});
            res.status(200).send({message: 'O status do livro foi atualizado com sucesso'});
        } catch (err) {
            res.status(500).send({message: err.message});
        }
    }

Para fazer o get e retornar os livros, eu consegui da seguinte forma:

    static listarLivros = async (req, res) =>{
        try {
            const livrosResultado = await livros.find();
            res.status(200).json(livrosResultado)
        } catch (err) {
            res.status(500).json(err);
        }
    }
4 respostas

também estou com o mesmo problema, já tentei fazer algumas mudanças e mesmo assim não modifica no banco de dados.![](Insira aqui a descrição dessa imagem para ajudar na acessibilidade )

solução!

Resolvido.

O problema é que o id criado automaticamento pelo Mongo é do tipo ObjectId('id') e quando criamos o Schema do Livro, colocamos o tipo 'String'.

Tive 2 opções: 1) alterar o tipo ObjectId('id') para 'String' na db do Mongo (aí o controle de criação e gestão de id's fica por sua conta), ou 2) alterar a entrada 'id' do meu Schema para 'SchemaTypes.ObjectID' (aí continuo usando os id's criados pelo mongo automaticamente)

Meu Schema ficou:

const livroSchema = new mongoose.Schema(
    {
        id: {type: SchemaTypes.ObjectId, required: false}, ...

A minha ainda sim não vai. Alterei para o tipo do id para Object, pois apontou que SchemaTypes.ObjectId é undefined. Então ficou assim:


import mongoose from "mongoose";

const bookSchema = new mongoose.Schema({
  id: { type: Object },
  title: { type: String, required: true },
  author: { type: String, required: true },
  production: { type: String, required: true },
  pages: { type: Number, required: true },
});

export const books = mongoose.model("books", bookSchema);

Mesmo assim, sem sucesso...

João Victor

Object é um tipo do JavaScript. O que você precisa é de um tipo que o mongoose fornece, dessa forma:

import { Schema, SchemaTypes, model } from 'mongoose';

const bookSchema = new Schema({
    id: { type: SchemaTypes.ObjectId }, // note aqui o SchemaTypes.ObjectId
    title: { type: String, required: true },
    author: { type: String, required: true },
    publishing_company: { type: String, required: true },
    pages: { type: Number }
});

const book = model('books', bookSchema);

export default book;

Tenta ai, e nos dê retorno.