我在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]
任何人都可以帮助我,或者给我一些暗示我可以检查什么以了解发生了什么?
谢谢!
答案 0 :(得分:0)
我刚刚意识到发生了什么,这是我的错误。
这在数据库中正确更新,但由于User.update位于中间件中,我没有返回更新的记录,因此我的Web应用程序中的对象没有被更新。
因此,当为双打创建新游戏时,我编辑了用户以添加一些控制信息,因此覆盖了游戏值。
为这个问题道歉,愚蠢的错误。