Мангуст, как обновить несколько вложенных документов в разных документах за один вызов - стек MERN - PullRequest
1 голос
/ 13 марта 2019

Я хочу сделать вызов API через mongoose, чтобы обновить поле даты партии из выбранных Players (схема ниже) cards поддокумент на текущую дату.

Схема проигрывателя:

const playerSchema = new Schema({
  name: String,
  cards: [{
    date: { type: Date, required: true },
    note: String
  }],
});

Я создал флажок, в котором пользователь может выбрать несколько Players (вместе с конкретным поддокументом 'карточка' из своего массива cards) и изменить даты, чтобы они были одинаковыми для всех этих карточек для всехвыбранный Players.В ответ я сгруппировал соответствующие ObjectId вместе в теле и отправляю выбранные комбинации игроков / карт в массиве объектов, которые выглядят следующим образом (где число указывает на один и тот же сгруппированный поддокумент игрока и карты ObjectId):

Массив, который я отправляю на сервер (доступен через req.body.cards):

[ {cardId: card1._id, playerId: player1._id},
  {cardId: card2._id, playerId: player2._id},
  {cardId: card3._id, playerId: player3._id} ]

На моем маршруте Node / Express server put, как мне обновить все эти проигрыватели?и их конкретные карты и давая им все ту же дату (Date.now ()) асинхронно?Другими словами, как бы я правильно перебрал все различные идентификаторы игроков и их соответствующие идентификаторы карт (желательно без каких-либо внешних библиотек)?

Вот как я обновляю одну карту для одного игрока в моем обычном пут-путе дляредактирование вложенного документа cards:

Player.findById(playerId)
  .then(player => {
    const card = player.cards.id(cardId);
    card.date = Date.now();

    player.save(
      (err, updatedCard) =>
        err
          ? console.log("Error in update card: " + err)
          : res.send(updatedCard)
    );
  })
  .catch(err => res.status(404).json({ success: false }));

1 Ответ

1 голос
/ 13 марта 2019

Я думаю, что это должно работать.

Один игрок может быть обновлен с помощью этого запроса: -

Player.findOneAndUpdate(
  { _id: playerId, "cards._id": cardId },
  { $set: { "cards.$.date": Date.now() } }
);

Несколько игроков могут быть обновлены с помощью этого запроса

Player.update(
  { $or: [{ _id: player1Id, "cards._id": card1Id }, { _id: player2Id, "cards._id": card2Id }, { _id: player3Id, "cards._id": card3Id }] },
  { $set: { "cards.$.date": Date.now() } },
  { multi: true }
);

Позиционный оператор $ позаботится об обновлении правильной карты внутри массива с указанным идентификатором карты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...