首页 文章

为什么在使用MongoDB的$ push向数组添加新对象时添加了带有ObjectID的_id?

提问于
浏览
6

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

我想在播放器对象的tournamentSessions字段中添加一个新的tournamentSession对象(不是Mongoose对象) . 我使用findOneAndUpdate来确保我不会添加相同的锦标赛两次(使用“$ 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
    }
}));

1 回答

  • 8

    您可以通过使用自己的架构显式定义 tournamentSessions 数组来禁用 _id 字段,以便可以将其_id option设置为 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
    }));
    

相关问题