为什么在使用MongoDB的$ push将新对象添加到数组时,为什么添加了ObjectID的_id?

我正在使用Node.js和Mongoose。 玩家和锦标赛variables是Mongoose对象,就在之前获取。

我想添加一个新的tournamentSession对象(不是一个Mongoose对象)到玩家对象的tournamentSessions字段。 我正在使用findOneAndUpdate能够确保我不添加两个相同的tournement(使用“$ ne”)

Player.findOneAndUpdate({ '_id': player._id, 'tournamentSessions.tournament': { '$ne': tournament._id } }, { '$push': { 'tournamentSessions': { 'tournament': tournament._id, 'level': 1, 'status': 'LIMBO', 'score': 0, } } }, function(err, updatedPlayer) { // ... }); 

一切正常,除了包含ObjectID的“_id”字段被添加到tournamentSessions数组中新添加的会话,我不明白为什么会发生这种情况。

如果我手动添加“_id”字段和值“BLABLABLA”,“_id”字段永远不会被存储(因为它应该,因为它没有在模式中声明)

嗯,这是模式:

 var Player = mongoose.model('Player', Schema({ createdAt: { type: Date, default: Date.now }, lastActiveAt: Date, clientVersion: String, tournamentSessions: [{ tournament: { type: Schema.Types.ObjectId, ref: 'Tournament' }, level: Number, status: String, score: Number }], friends: Array })); var Tournament = mongoose.model('Tournament', Schema({ createdAt: { type: Date, default: Date.now }, open: Boolean, number: Number, level: Number, reactionLimit: Number, deadlineAt: Date, stats: { total: Number, limbo: Number, blessed: Number, damned: Number } })); 

您可以通过显式定义具有自己的模式的tournamentSessions数组来禁用_id字段,以便可以将其_id选项设置为false

 var Player = mongoose.model('Player', Schema({ createdAt: { type: Date, default: Date.now }, lastActiveAt: Date, clientVersion: String, tournamentSessions: [new Schema({ tournament: { type: Schema.Types.ObjectId, ref: 'Tournament' }, level: Number, status: String, score: Number }, { _id: false })], friends: Array }));