node.js - Mongoose 如何一次调用更新不同文档中的多个子文档 - MERN 堆栈

标签 node.js mongodb express mongoose

我想通过 mongoose 进行 API 调用,将一批选定的 Players(架构如下)cards 子文档的日期字段更新为当前日期。

播放器架构:

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

我创建了一个复选框,用户可以在其中选择多个Players(以及cards数组中的特定“card”子文档)并将日期更改为相同对于所有选定的玩家的特定卡牌。在 react 中,我在正文中将相应的 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())?换句话说,我如何正确迭代所有不同的playerIds及其各自的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 }));

最佳答案

我认为这应该可行。

可以使用此查询更新单人游戏:-

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 更新数组内的正确卡。

关于node.js - Mongoose 如何一次调用更新不同文档中的多个子文档 - MERN 堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55137280/

相关文章:

javascript - 使用 JavaScript 创建 .json 文件并在其中存储数据?

javascript - 从迭代器/生成器获取单个 yield 值

javascript - Meteor - 插入对象数组

node.js - 将大型 MongoDB 实例中的字符串索引更改为 ObjectID 索引

centos 7 mongodb无法启动

javascript - 如何使用express JS以特定方式从URL读取参数

javascript - 使用 Express 创建单页应用程序

node.js - Node openCV安装

javascript - 无法在nodejs中使用toLocaleString

javascript - Expressjs Morgan 动态格式化日志