当前位置: 首页 > 知识库问答 >
问题:

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

郭兴平
2023-03-14

我想通过猫鼬进行API调用,以将一批选定的Players(下面的模式)子文档的日期字段更新为当前日期。

Player模式:

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

我创建了一个复选框,用户可以在其中选择多个玩家(以及他们的卡片数组中的特定'卡片'子文档),并将所有选定的玩家的特定卡片的日期更改为相同的日期...作为反应,我将相应的ObjectIds在主体中批处理在一起,并将选定的玩家/卡片组合发送到一个对象数组中,如下所示(其中数字表示相同的分组玩家

我正在发送到服务器的阵列(可通过req.body.cards访问):

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

在我的Node/Express serverputroute中,我将如何更新所有玩家及其特定卡,并异步为他们提供所有相同的日期(date.now()?换句话说,我如何正确地迭代所有不同的playerid及其各自的cardId(最好没有任何外部库)?

以下是我如何在我的常规放牌路线中为单个玩家更新一张卡片,以编辑卡片子文档:

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个答案

浦德明
2023-03-14

我认为这应该行得通。

单人播放器可以通过以下查询进行更新:-

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

 类似资料:
  • 我想使用mongoose从多个文档更新多个子文档。 我目前的代码是: 模式的一部分是: 但是这段代码只更新id arr中的最后一个元素。

  • 我试图更新一个子文档(有效),然后更新除上一个子文档之外的多个子文档。基本上,每次

  • 我有一份这样的文件: 我想通过将其与数量字段(2*800)相乘来更新价格字段,其中的结果将更新/分配给价格。(对于本例,价格更新为1600)。 更新后的文档: 我的选择查询如下: 我怎样才能做到这一点?

  • 问题内容: 也许是时候了,也许是我淹没在稀疏的文档中,无法将自己的头围在Mongoose中的更新概念上:) 这是交易: 我有一个联系模式和模型(缩短的属性): 我从客户端收到一个包含我需要的字段的请求,并因此使用我的模型: 现在我们解决了这个问题: 如果我打电话,如果使用相同电话号码的联系人已经存在(如预期-唯一),我将收到一条错误消息 我无法致电联系,因为该方法在文档中不存在 如果我对模型调用u

  • 我有一个mongodb集合的mongoose模式,我将其定义如下: 在数据库集合中,我当前有一个文档,它包含除以外的所有属性的值,用于测试目的。我有一个服务器endpoint,当被调用时,它应该发出一个PUT请求来更新文档并向sketches数组中添加一个对象: 在这个web服务中,我基本上试图通过用户名选择用户文档,用户名作为参数传递给url字符串,如下所示: 由于某种原因,当我尝试使用具有以下

  • 本文向大家介绍MongoDB中一次查询更新多个文档,包括了MongoDB中一次查询更新多个文档的使用技巧和注意事项,需要的朋友参考一下 要通过单个查询更新许多文档,请在MongoDB中使用 bulkWrite()。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是使用MongoDB中的一个查询来更新许多文档的查询- 在find()方法的帮助