为啥使用 MongoDB 的 $push 将新对象添加到数组时添加了带有 ObjectID 的 _id?

Posted

技术标签:

【中文标题】为啥使用 MongoDB 的 $push 将新对象添加到数组时添加了带有 ObjectID 的 _id?【英文标题】:Why is an _id with ObjectID added to when using MongoDB's $push to add new object to an array?为什么使用 MongoDB 的 $push 将新对象添加到数组时添加了带有 ObjectID 的 _id? 【发布时间】:2014-01-18 17:59:17 【问题描述】:

我正在使用 Node.js 和 Mongoose。 玩家和锦标赛变量是之前获取的 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”字段被添加到锦标赛会话数组中新添加的会话中,我不明白为什么会发生这种情况。

如果我手动添加“_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】:

您可以通过使用自己的架构显式定义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
));

【讨论】:

像魅力一样工作。感谢您的超快回复!您不知道如何使新的 Schemas 字段“锦标赛”独一无二?我想防止玩家两次参加同一个锦标赛。我在现场尝试了设置 unique = true ,但它仍然有效。

以上是关于为啥使用 MongoDB 的 $push 将新对象添加到数组时添加了带有 ObjectID 的 _id?的主要内容,如果未能解决你的问题,请参考以下文章

将新评论推送到 mongoose/mongodb/angularjs 中的评论数组中

如何正确地将对象 $push 到 MongoDB 模式属性中,类型:数组

将新对象插入特定数组索引

spring mongodb push操作

Mongodb $push 运算符不起作用

如何使用 pymongo 将新的值数组附加到 mongodb 中的现有数组文档?