Привет, я пытаюсь сделать запрос мангуста для запуска только один раз, если поле внутри документа еще не было обновлено, но я немного теряюсь с $exist, $update, $ne, не знаю, что использовать В самом деле.
У меня есть следующий запрос
const assignPhotoCodeToModel = (modelID, photoCode) => {
const filter = { id: modelID }
const update = { photoCode: photoCode }
const options = { new: true, useFindAndModify: false }
return new Promise((resolve, reject) => {
ModelModel.findOneAndUpdate(filter, update, options)
.then((response) => {
resolve(response)
})
.catch((error) => {
reject(error)
})
})
}
Но я хочу, чтобы это запускалось, только если поле Model.photoCode пусто. Если у него уже есть значение, я просто хочу, чтобы он вернул это значение.
Проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда бэкэнд попадает в маршрут, новый photoCode назначается модели, даже если он уже назначен. Таким образом, он снова переназначается на новый.
router.post(
'/payment/success',
(req, res, next) => {
...omitted_code...
photoCodeModel
.assignPhotoCodeToModel(req.body.modelId, photoCode)
... omitted_code
})
Обновлено: 1:
Хорошо, я пишу это, попробовав ответы, представленные здесь. На первый взгляд кажется, что они работают, но теперь я обнаруживаю ошибку: когда в Model.photoCode уже есть значение, возвращается следующая функция:
const assignPhotoCodeToModel = (modelID, photoCode) => {
//the difference is here
const filter = { id: modelID, photoCode : null }
const update = { $set: { photoCode: photoCode } }
const options = { new: true, useFindAndModify: false }
return new Promise((resolve, reject) => {
ModelModel.findOneAndUpdate(filter, update, options)
.then((response) => {
resolve(response)
})
.catch((error) => {
reject(error)
})
})
}
возвращает null, хотя на самом деле я ожидаю возврата того же документа модели. Полагаю, это из-за фильтрации? Когда я удаляю photoCode : null, он возвращается в "рабочий режим", но затем я снова возвращаюсь к проблеме, заключающейся в том, что поле photoCode заполняется новыми значениями.
В принципе, я бы хотел, чтобы эта функция заполняла поданный photoCode один раз, но каждый последующий вызов должен просто возвращать мне тот же документ модели





Я думаю, что вам нужно $ set. И, следуя вашей логике, я думаю, вам нужно запросить «документ, у которого еще нет photoCode». Так должно быть:
const assignPhotoCodeToModel = (modelID, photoCode) => {
//the difference is here
const filter = { id: modelID, photoCode : null }
const update = { $set: { photoCode: photoCode } }
const options = { new: true, useFindAndModify: false }
return new Promise((resolve, reject) => {
ModelModel.findOneAndUpdate(filter, update, options)
.then((response) => {
resolve(response)
})
.catch((error) => {
reject(error)
})
})
}
Напишите это в аккуратной асинхронной форме. Это будет работать.
const assignPhotoCodeToModel = async (modelID, photoCode) => {
const filter = { id: modelID, photoCode : null };
const update = { photoCode: photoCode };
const options = { new: true, useFindAndModify: false };
return await ModelModel.findOneAndUpdate(filter, update, options);
}