@ymenaidtopa

Mongoose как обновлять обьект в массиве?

у меня есть документ:
{
  activation: {
    isActive: true,
    stopActiveDate: 1669036712884,
    activeLevel: 0,
    setActiveMessage: false,
    preview: 'double'
  },
  gameInfo: {
    resultData: { hash: '', number: 0, secret: '' },
    bets: [ [Object] ],
    amount: 1,
    timer: 60
  },
  _id: new ObjectId("637b7ab2427e29ad0612f2bf"),
  id: 2000000001,
  name: 'Беседа VUL Coin',
  __v: 7,
  gamemode: 'double',
  procent: 0.01,
  ownerId: 655037535
}


в gameInfo.bets хранится массив с обьектами, внутри одно из обьектов нужно обновлять один из элементов

пример обьекта:
{
  id: 655037535,
  peerId: 2000000001,
  name: "Tester",
  x2: 0,
  x3: 0,
  x5: 0,
  x50: 0
}


пробовал обновлять таким способом:
ctx.conv.updateOne({ 'gameInfo.bets.id': ctx.senderId }, { '$set': {
                'gameInfo.bets.$.x2': 10000
            }}, function(err) {
                console.log(`ебулда не работает - ${err}`)
            });


дает ошибку:
MongoServerError: Cannot create field 'id' in element {bets: [ { id: 655037535, peerId: 2000000001, name: "негр", x2: 0, x3: 0, x5: 0, x50: 0 } ]}
  • Вопрос задан
  • 130 просмотров
Пригласить эксперта
Ответы на вопрос 1
@foterio
1. Получаем документ из MongoDB
const document = await ВашаСущность.findById(id)
2. Берем массив чтобы удобнее с ним работать
const bets = [...document.gameInfo.bets]
3. Производим необходимые изменения
// id ставки, которую нужно обновить
const betId = 655037535
// Получаем обновленный массив ставок
const updatedBets = bets.map((bet) => {
  // Если betId совпадает с нашей ставкой, то изменяем объект
  if (bet.id == betId) return {
    ...bet,
    name: 'Новое значение поля Name',
  }
  // Остальные ставки остаются нетронутыми
  return bet
})

4. Сохраняем результат в MongoDB
const update = {
  gameInfo: {
    ...document.gameInfo,
    bets,
  }
}
const updatedDocument = findOneAndUpdate({ _id: id }, update)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы