findByIdAndUpdate не обновляет документ

#mongodb #express #mongoose

#mongodb #экспресс #мангуст

Вопрос:

Я пытаюсь обновить поле в документе с помощью findByIdAndUpdate. Поле, которое я пытаюсь обновить, определено в модели Bar. И я также могу заверить, что req.body.bookId имеет действительный идентификатор.

Вот как выглядит мой запрос,

 app.patch("/foo", async (req, res) => {
    try {
        await validateId(req.body.bookId);

        let doc = await Bar.findByIdAndUpdate(
            req.body.bookId,
            { DateT: Date.now() },
            { new: true }
        );

        res.send(doc);
    } catch (err) {
        console.log(err);
    }
});
 

Схема панели,

 const mongoose = require("mongoose");

const barSchema = mongoose.Schema({
    bookId: {
        type: String,
        unique: true,
    },
    DateT: {
        type: Date,
        default: null,
    },
});

module.exports = mongoose.model("Bar", barSchema);
 

Комментарии:

1. Я обнаружил вашу проблему: вы присваиваете идентификатор BookID, но не присваиваете его _id ключу, и поэтому вы не можете использовать findByIdAndUpdatene , потому что для _id генерируется другой идентификатор

2. @MohammadYaserAhmadi, да, вы правы. Использование updateOne и передача bookId в запрос работает просто отлично.

Ответ №1:

использовать updateOne , когда вы используете async не использовать .then() использовать try/catch

протестируйте его:

 
app.patch("/foo", async (req, res) => {
  try {
    let doc = await Bar.updateOne(
      { bookId : req.body.bookId },
      { DateT: Date.now() },
      { new: true }
    );
    res.send(doc);
  } catch (error) {
    console.log(error);
  }
});
 

Комментарии:

1. К сожалению, это не сработало. И что касается использования $set , это было не причиной, вы могли бы назвать это «бесполезным» прямо здесь для этого варианта использования . Кроме того, я тоже пытался использовать try catch, но не работает.

2. @MohammadYasarAhmadi, я также обновил свой фрагмент кода, и это не работает.

3. если req.body.id это мангуст. Types.ObjectId, может быть, что-то не так в вашей схеме

4. req.body.id является строкой, и поэтому она определена в схеме.

5. Этого не должно быть {bookId = req.body.bookId} , так и должно быть {bookId : req.body.bookId} . Я внес правку, исправляющую это @MohammadYaserAhmadi

Ответ №2:

 app.patch("/foo", async (req, res) => {
    await Bar.findByIdAndUpdate(
        req.body.bookId,
        { DateT: Date.now()},
        (err, docs) => {
            if (err) {
                console.log(err);
            } else {
                res.send(docs);
            }
        }
    );
});
 

Комментарии:

1. Простое изменение имени переменной не заставит его работать, не в этом случае. Это сработало бы, если пользовательская переменная переопределяет любую зарезервированную переменную, чего здесь не происходит.