У меня есть это, и я не могу заставить его работать. Console.log регистрирует нуль. Если я регистрируюсь перед кодом обновления, он фактически регистрирует элемент, который я пытаюсь отредактировать. Если я сделаю это после findOneAndUpdate(), он вернет null.
Редактировать 2:
Я изменил метод мангуста на findById, и это сработало. Но все же есть одна проблема. Новый код:
let promo = await Promo.findById(req.body._id)
console.info('Promo findById(promoId) => ' + promo)
console.info('Promo Fields => ' + JSON.stringify(promoFields))
if (promo) {
// Update
const promo = await Promo.findOneAndUpdate(
{ promo: req.body_id },
{ $set: promoFields },
{ new: true },
(err, doc) =>
console.info(err + ' <--- err ///// ' + doc + ' <--- doc ')
)
return res.json(promo)
Выход:
[0] Promo findById(promoId) => { _id: 5cee8b0134349e1eec482053,
[0] title: 'Dos',
[0] subtitle: 'dos',
[0] desc: 'dos',
[0] __v: 0 }
[0] Promo Fields => {"title":"Dos","subtitle":"dos","desc":"dos"}
[0] null <--- err ///// { _id: 5cee6bcbcfd3f11d580aa715,
[0] new: false,
[0] desc: 'dos',
[0] subtitle: 'dos',
[0] title: 'Dos' } <--- doc
Проблема теперь в том, что независимо от того, какой элемент из списка я редактирую, он всегда обновляет первый. Может ли быть несоответствие id? Если я отлаживаю идентификатор из req, у меня есть правильный идентификатор из выбранного элемента ... не знаю, почему он ведет себя таким образом. И последнее, но не менее важное: редуктор:
const initialState = {
promos: null
}
export default function(state = initialState, action) {
const { type, payload } = action
switch (type) {
case POST_PROMOS:
return {
...state,
...payload,
loading: false
}
default:
return state
}
}
Мне было интересно, могу ли я в уменьшении сделать что-то вроде
state.promos.filter(promo => promo._id !== payload)
а затем сгенерируйте новый массив с элементом полезной нагрузки. Я смешиваю понятия?
заранее спасибо
Мой плохой @developing2020, уже отредактированный.
Я читал, что он регистрирует элемент перед обновлением. Итак, вы можете добавить вывод console.info(promo) после findOne?
@JackRed Если я запустил его перед строкой if (promo){
, он регистрирует фактический элемент
@JackRed, и если я return res.json(promo), console.info(promo)
все в одной строке, регистрируя ее после, она остается нулевой
@NicolásRiccardi, вы пытались установить для новой опции значение false, чтобы увидеть, возвращает ли она старый объект? Вы проверяли в БД, действительно ли объект обновляется или он не изменяется?
@JackRed После передачи true в new он продолжает возвращать значение null. В БД не меняется. я что-то пропустил здесь??
Если я let promo = await Promo.findOne(promoId); console.info('Promo findOne(promoId) => ' + promo); if (promo) { const promo = await Promo.findOneAndUpdate( { promo: promoId }, { $set: req.body }, { new: true } ); console.info('Promo after findOneAndUpdate() => ' + promo); return res.json(promo); }
консоль вернет это `Promo findOne(promoId) => { _id: 5ced4ba709b3112b003e5541, title: '2', subtitle: '2', desc: '2', __v: 0 } Promo после findOneAndUpdate() => null `
Я попросил вас установить для нового значение false, чтобы проверять старый объект, а не обновленный.
Если я установлю значение false, он вернет старый объект, но не обновится в БД.
Можете попробовать const promo = await Promo.findOneAndUpdate( { promo: promoId }, { $set: req.body }, { new: true } (err, doc) => {console.info(err, doc)})
?
Подождите, насчет вашего обновления, я не использовал мангуста с момента, но вы заменяете весь объект, не так ли (хотя не уверен, если нет, игнорируйте комментарий)? Почему бы не использовать найтиOneAndReplace.
Да, он возвращает null null. О.О.
Пробовал с findOneAndReplace и тот же результат
Ну так вы заменяете весь объект или только некоторые поля?
Это отправляется из формы интерфейса const { title, subtitle, desc, _id } = formData
.
Еще одна вещь, вы можете войти в promoFields, прежде чем пытаться обновить?
Промо-поля => {"title":"2","subtitle":"2","desc":"2"}
Попробуйте изменить имя переменной promo
. Вот так: const updatedPromo = await Promo.findOneAndUpdate( { promo: promoId }, { $set: promoFields }, { new: true } ) console.info(updatedPromo ) return res.json(updatedPromo )
Он продолжает возвращать ноль :((((((((( Err, doc => null null
Promo after findOneAndUpdate() => updatedPromo = null
Ну, я чувствую, что я что-то упускаю. Как будто что-то не так. Но извините, я не понимаю, почему у вас такое поведение. Вы пробовали обычное обновление?
Я сделал.. и это не сработало. Он работал, переходя на метод mogoose findById. думал, что у меня теперь новая проблема. Отредактировал пост. Кстати большое спасибо за все ваши ответы
Если у вас есть другая проблема, не редактируйте свой пост. Откатите редактирование к проблеме, на которую вы ответили, и примите свой ответ (если возможно, я не знаю, есть ли ограничение репутации). А затем задайте другой вопрос. Итак, таким образом, вы будет более наглядно, и если у кого-то такая же проблема, как у вас, он найдет здесь решение
Вы должны использовать $addToSet
вместо $set
, и, возможно, это сработает.
Тот же вывод.. ноль. Может это идентификатор модели?
ты отлаживаешь? может быть, вы что-то упускаете.
Бинго! Кажется, что req.body._id по какой-то причине, несмотря на то, что это был идентификатор из нужного элемента редактирования, это не был ObjectId.
я let promoId = mongoDb.ObjectId(req.body._id)
а потом
promo = await Promo.findOneAndUpdate(
{ _id: promoId },
{ $set: promoFields },
{ new: true }
)
:)! Спасибо
На что указывает
promoFields
?