使用猫鼬访问数组数组中的对象

Posted

技术标签:

【中文标题】使用猫鼬访问数组数组中的对象【英文标题】:Accessing object in array of arrays using mongoose 【发布时间】:2017-06-13 14:39:11 【问题描述】:

我有以下结构,并且正在尝试删除参与者 (league.division.participants) 中的一个对象。

var participantSchema = new mongoose.Schema(
player:  type: mongoose.Schema.Types.ObjectId, ref: 'Player' ,
record:  type: mongoose.Schema.Types.ObjectId, ref: 'ParticipantRecord' ,
events: [  type: mongoose.Schema.Types.ObjectId, ref: 'Event'  ]
);

var divisionSchema = new mongoose.Schema(
    name: String,
    participants: [ participantSchema ]
);

var leagueSchema = new mongoose.Schema(
    name: String,
    startDate:  type: Date, default: Date.now ,
    endDate: Date,
    locked: Boolean,
    leagueType:  type: mongoose.Schema.Types.ObjectId, ref: 'LeagueType' ,
    game:  type: mongoose.Schema.Types.ObjectId, ref: 'Game' ,
    divisions: [ divisionSchema ],
);

mongoose.model('League', leagueSchema);



var _RemoveDivisionParticipant = function(participantId)

    return new Promise((resolve,reject) =>
        Models.League.findOne('divisions.participants._id':participantId)
            .populate('divisions')
            .populate('divisions.participants')
            .exec((err, league) => 
                if (err) return reject(err)   
                league.divisions(XXXXX).participants(participantId).remove();
                console.log(league.divisions[0].participants[0])
            )
    )

这是我目前所拥有的,但显然它返回了联赛对象,我无法联系到参与者,因为我不知道参与者在哪个部门(示例中显示为 XXXXX)。关于我应该做什么的任何指示?

【问题讨论】:

***.com/questions/30714938/… 可能会有所帮助 阅读相关帖子中的答案 - ***.com/questions/14763721/… 【参考方案1】:

您可以使用$pull 根据条件删除数组元素:

League.update(
    'divisions.participants._id': participantId
, 
    $pull: 
        'divisions.$.participants': 
            "_id": participantId
        
    
,  multi: true , function(err, res) 
    console.log(res);
);

【讨论】:

完美。谢谢。跟进问题。当我输入您的解决方案时,我不小心在 pull 中使用了“division”而不是“divisions”,但 mongoose 没有返回错误。知道为什么吗? 如果没有与您的查询匹配,则不会发送错误(为什么会这样?),但在结果中,修改结果的数量res.nModified 将为 0 仍然有关系数据库的心态,所以当他没有找到它时,我预计会出错。再次感谢

以上是关于使用猫鼬访问数组数组中的对象的主要内容,如果未能解决你的问题,请参考以下文章

如何访问在 Mongoose 模式对象数组的另一个数组中定义的数组元素?

如何在猫鼬模型内的数组中查找对象?

寻找访问字符串的猫鼬数组

猫鼬,对象中的数组

如何使用猫鼬更新数组中的现有对象

猫鼬更新数组对象中的字段