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

模型使用Mongoose和$push更新会覆盖整个阵列

慕凌龙
2023-03-14

我在MongoDB中有一个非常简单的数据库,其中一部分包含在用户和游戏中。像这样的东西:

const GameSchema = new Schema({
  mode: Number
});

const UserSchema = new Schema({
  username: String,
  games: [{
    type: Schema.Types.ObjectId,
    ref: 'game'
  }]
});

所以现在当我创建游戏时,我也想更新游戏中的用户添加_id。例如,如果我用_id778创建了一个游戏,并且这个游戏由_ids111和222的用户玩,那么这些用户将把他们的游戏属性更新为添加778。

在给定的时间内,同一个用户可能在玩不同的游戏,所以用户游戏会进化,游戏:[778]=

为此,我使用Mongoose中间件。

GameSchema.post('save', function(doc, next) {
  const User = mongoose.model('user');

  Game.findById(doc._id)
    .populate('players')
    .then(game => {
      let userIds = // retrieve the ids of the users playing the game

      if (userIds.length) {
        User.update(
            { _id: { $in: userIds } },
            { $push: { games: this._id } },
            { safe: true, multi: true }
          )
          .then((data) => {
            console.log('updated users', data);
            // here it says that both users were updated
            next();
          });
      } else {
        next();
      }
    });
});

问题是,游戏可以有2个玩家或1个玩家,在最后一种情况下,这很好,但是当有2个用户需要更新时,它基本上覆盖了整个数组,而不是更新游戏以添加新值[778]=

有谁能帮我或给我一个提示,让我看看到底发生了什么?

谢谢!

共有1个答案

东方玉泽
2023-03-14

我才意识到发生了什么,这是我的错误。

这正在数据库中正确更新,但由于User.update在中间件中,我没有返回更新的记录,因此我的Web应用程序中的对象没有更新。

因此,当一个新的双打游戏被创建时,我编辑了用户以添加一些控制信息,从而覆盖了游戏值。

为这个问题道歉,愚蠢的错误。

 类似资料:
  • 问题内容: 我正在尝试在MongoDB中更新实例化模型(“地方”-我知道它可以在其他路线中使用),并且花了一段时间尝试正确地做到这一点。我还试图重定向回查看“位置”的页面,以查看更新的属性。 节点v0.4.0,Express v1.0.7,Mongoose 1.10.0 架构: 控制器/路线: }); 我尝试了多种方法,但似乎无法理解。 另外,我不是如何声明三个{name,capital和cont

  • 我对Mongoose/Mongo和node非常陌生。js,所以我怀疑这只是我的误解,但是。。。 下面的代码示例是最小的失败示例,而不是我的用例。 这会导致以下错误:将更新应用于文档{_id: ObjectId('54647402cb955748153ea782'),...}后,发现(不可变)字段'_id'已更改为_id: ObjectId('546d9e0e539ed9ec102348f9') 为

  • 以下是场景(简化): 有一个bean(称为),其中包含一个成员和适当的getters/setters: JSF代码: 问题是,当单击“添加”按钮时,

  • 我想制作一个插件,允许玩家自定义他们的盔甲模型和纹理。我希望服务器上的其他玩家能够看到这些自定义设置。 由于我从未在插件中做过纹理覆盖,我不知道这是否可行,我也无法在网上找到任何相关的东西。我知道你可以让积木看起来和其他积木一样,但是盔甲不行。 我必须给在线玩家发送一个数据包,还是有其他方法可以做到这一点?如果这是可能的,是否有一个地方记录了如何做到这一点?

  • 问题内容: 例如,在mysql中更新表时: 表 如果我运行查询 MYSQL会再次写入相同的值还是因为内容相同而忽略它? 这是我提出的问答问题,正如Stack Overflow鼓励的那样,我认为这对于将来有相同问题的其他程序员将是有用的。 问题答案: 正如MYSQL手册中UPDATE语句所暗示的那样, 如果将列设置为其当前值,MySQL会注意到这一点,并且不会对其进行更新。 因此,如果运行此查询,M

  • 问题内容: 在保存模型之前,我需要重新调整图片大小。但是,如何检查是否添加了新图片或仅更新了说明,以便每次保存模型时都可以跳过重新缩放? 我只想在加载新图像或更新图像时重新缩放,而在更新说明时不想要。 问题答案: 一些想法: 不确定是否可以在所有伪自动django工具中正常运行(例如:ModelForm,contrib.admin等)。