猫鼬如何在一次调用中更新不同文档中的多个子文档-MERN堆栈

时间:2019-03-13 08:25:34

标签: node.js mongodb express mongoose

我想通过猫鼬进行API调用,以将一批选定的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服务器put路由中,我该如何更新所有这些玩家及其特定的牌并异步给它们所有相同的日期(Date.now())?换句话说,我如何适当地迭代所有不同的playerId及其各自的cardId(最好没有任何外部库)?

以下是我按照常规投放路线为单个玩家更新单张纸牌以编辑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 个答案:

答案 0 :(得分:1)

我认为这应该可行。

可以使用以下查询更新单个播放器:-

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 }
);

位置运算符$将负责使用给定的卡片ID更新阵列内的正确卡片。