#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. Простое изменение имени переменной не заставит его работать, не в этом случае. Это сработало бы, если пользовательская переменная переопределяет любую зарезервированную переменную, чего здесь не происходит.