Node.js 更新并指定addToSet的密钥

Node.js 更新并指定addToSet的密钥,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我创建了一个模型,其中包含一组匹配项。但是,每次我更新文档时,它只是将匹配项添加到匹配项,这会导致重复。我想知道是否有一种方法可以让我指定一个键,在我的例子中是matchId,如果它已经存在于matches集合中,它应该更新集合中的特定对象 型号 var leagueSchema = new Schema({ _id: Number, name: String, league: Number, matches: [{ matchId: Number

我创建了一个模型,其中包含一组
匹配项。但是,每次我更新文档时,它只是将匹配项添加到
匹配项
,这会导致重复。我想知道是否有一种方法可以让我指定一个键,在我的例子中是
matchId
,如果它已经存在于
matches
集合中,它应该更新集合中的特定对象

型号

var leagueSchema = new Schema({
    _id: Number,
    name: String,
    league: Number,
    matches: [{
        matchId: Number,
        date: Date,
        tournament: String,
        homeName: String,
        awayName: String,
        awayScore: Number,
        homeScore: Number,
        homeLogo: String,
        awayLogo: String
    }]
});
更新查询

var queryData = {'matchId': matchId, 'date': date, 'tournament': tournament, 'homeName': homeTeam, 'awayName': awayTeam, 'awayScore': awayScore, 'homeScore': homeScore, 'homeLogo': homeLogo, 'awayLogo': awayLogo};

League.update({league: leagueId}, {$addToSet: {matches: queryData}})
    .exec(function(err, update) {
});

您可以使过滤器更精确。当找到
matchId
时,您可以排除
matches
数组中的项。当在匹配项中找到您的matchId时,它将不会“找到”文档,因此不会更新文档。(我知道这很混乱!)您的查询将如下所示:

League.update({league: leagueId, 'matches.matchId': {$ne: matchId}}, {$addToSet: {matches: queryData}})
    .exec(function(err, update) {
        // Do something
    });

您可以使过滤器更精确。当找到
matchId
时,您可以排除
matches
数组中的项。当在匹配项中找到您的matchId时,它将不会“找到”文档,因此不会更新文档。(我知道这很混乱!)您的查询将如下所示:

League.update({league: leagueId, 'matches.matchId': {$ne: matchId}}, {$addToSet: {matches: queryData}})
    .exec(function(err, update) {
        // Do something
    });

@我觉得这个问题有点不同。在这种情况下,如果存在具有相同matchId密钥的匹配记录,则需要更新匹配记录。因此它不是重复的,你的答案也不是这个问题的完整答案。@RashadIbrahimov明白了,我第一次没听清楚,谢谢。@JohnnyHK我觉得这个问题有点不同。在这种情况下,如果存在具有相同matchId密钥的匹配记录,则需要更新匹配记录。因此它不是重复的,你的答案也不是这个问题的完整答案。@RashadIbrahimov明白了,我第一次没听清楚,谢谢。