MongoDB findOneAndUpdate возвращает ноль

У меня есть это, и я не могу заставить его работать. 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)

а затем сгенерируйте новый массив с элементом полезной нагрузки. Я смешиваю понятия?

заранее спасибо

На что указывает promoFields?

developing2020 28.05.2019 15:48

Мой плохой @developing2020, уже отредактированный.

Nicolás Riccardi 28.05.2019 15:50

Я читал, что он регистрирует элемент перед обновлением. Итак, вы можете добавить вывод console.info(promo) после findOne?

JackRed 28.05.2019 16:03

@JackRed Если я запустил его перед строкой if (promo){, он регистрирует фактический элемент

Nicolás Riccardi 28.05.2019 16:11

@JackRed, и если я return res.json(promo), console.info(promo) все в одной строке, регистрируя ее после, она остается нулевой

Nicolás Riccardi 28.05.2019 16:12

@NicolásRiccardi, вы пытались установить для новой опции значение false, чтобы увидеть, возвращает ли она старый объект? Вы проверяли в БД, действительно ли объект обновляется или он не изменяется?

JackRed 28.05.2019 16:19

@JackRed После передачи true в new он продолжает возвращать значение null. В БД не меняется. я что-то пропустил здесь??

Nicolás Riccardi 28.05.2019 16:58

Если я 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 `

Nicolás Riccardi 28.05.2019 17:04

Я попросил вас установить для нового значение false, чтобы проверять старый объект, а не обновленный.

JackRed 28.05.2019 17:07

Если я установлю значение false, он вернет старый объект, но не обновится в БД.

Nicolás Riccardi 28.05.2019 17:09

Можете попробовать const promo = await Promo.findOneAndUpdate( { promo: promoId }, { $set: req.body }, { new: true } (err, doc) => {console.info(err, doc)})?

JackRed 28.05.2019 17:10

Подождите, насчет вашего обновления, я не использовал мангуста с момента, но вы заменяете весь объект, не так ли (хотя не уверен, если нет, игнорируйте комментарий)? Почему бы не использовать найтиOneAndReplace.

JackRed 28.05.2019 17:15

Да, он возвращает null null. О.О.

Nicolás Riccardi 28.05.2019 17:16

Пробовал с findOneAndReplace и тот же результат

Nicolás Riccardi 28.05.2019 17:17

Ну так вы заменяете весь объект или только некоторые поля?

JackRed 28.05.2019 17:18

Это отправляется из формы интерфейса const { title, subtitle, desc, _id } = formData.

Nicolás Riccardi 28.05.2019 17:21

Еще одна вещь, вы можете войти в promoFields, прежде чем пытаться обновить?

JackRed 28.05.2019 17:22

Промо-поля => {"title":"2","subtitle":"2","desc":"2"}

Nicolás Riccardi 28.05.2019 17:45

Попробуйте изменить имя переменной promo. Вот так: const updatedPromo = await Promo.findOneAndUpdate( { promo: promoId }, { $set: promoFields }, { new: true } ) console.info(updatedPromo ) return res.json(updatedPromo )

developing2020 28.05.2019 17:58

Он продолжает возвращать ноль :((((((((( Err, doc => null nullPromo after findOneAndUpdate() => updatedPromo = null

Nicolás Riccardi 28.05.2019 18:21

Ну, я чувствую, что я что-то упускаю. Как будто что-то не так. Но извините, я не понимаю, почему у вас такое поведение. Вы пробовали обычное обновление?

JackRed 29.05.2019 10:08

Я сделал.. и это не сработало. Он работал, переходя на метод mogoose findById. думал, что у меня теперь новая проблема. Отредактировал пост. Кстати большое спасибо за все ваши ответы

Nicolás Riccardi 29.05.2019 15:23

Если у вас есть другая проблема, не редактируйте свой пост. Откатите редактирование к проблеме, на которую вы ответили, и примите свой ответ (если возможно, я не знаю, есть ли ограничение репутации). А затем задайте другой вопрос. Итак, таким образом, вы будет более наглядно, и если у кого-то такая же проблема, как у вас, он найдет здесь решение

JackRed 07.06.2019 07:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
23
405
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны использовать $addToSet вместо $set, и, возможно, это сработает.

Тот же вывод.. ноль. Может это идентификатор модели?

Nicolás Riccardi 29.05.2019 11:17

ты отлаживаешь? может быть, вы что-то упускаете.

Hassan Ali 29.05.2019 11:46
Ответ принят как подходящий

Бинго! Кажется, что req.body._id по какой-то причине, несмотря на то, что это был идентификатор из нужного элемента редактирования, это не был ObjectId.

я let promoId = mongoDb.ObjectId(req.body._id) а потом

promo = await Promo.findOneAndUpdate(
          { _id: promoId },
          { $set: promoFields },
          { new: true }
        )

:)! Спасибо

Другие вопросы по теме