使用Mongoose和$ push的Model.update覆盖整个数组

时间:2017-02-16 08:32:09

标签: mongodb mongoose

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

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

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

所以现在当我创建一个游戏时,我还要更新游戏中添加_id的用户。例如,如果我使用_id 778创建游戏,并且此游戏由具有_ids 111和222的用户播放,那么这些用户将更新其游戏属性以添加778。

在给定时间内,同一用户可能正在玩不同的游戏,因此用户游戏将进化,游戏:[778] => [778,889] => [778,889,901]等等......

要做到这一点,我使用的是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] => [889] => [901]

任何人都可以帮助我,或者给我一些暗示我可以检查什么以了解发生了什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

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

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