4

我正在尝试使用 Mongoose 进行 upsert,但是对于应该触发 upsert 的键,我遇到了重复的键错误。

架构:

"resource": {type: Schema.ObjectId, ref: "Resource"},                       
"skill": {type: Schema.ObjectId, ref: "Skill"},                             
"level": {type: Number, min: 1, max: 5}

.index({skill: 1, resource: 1}, {unique: true});

然后我打电话:

    //self is a Resource instance
    ResourceSkillLevel.update({                                           
        resource: self._id,
        skill: skill._id,
        level: level
    }, {$set: {level: level}}, {upsert: true}, cb);

如果(resource, skill)不存在,则此调用可以正常工作并正确创建ResourceSkillLevel条目。但是,当我再次调用它时,我得到duplicate key error index. 列出的重复键是元组资源/技能键。为什么找到重复项时它不更新插入?

4

1 回答 1

7

您包含levelupdate查询条件参数中,因此如果它与现有记录不匹配,它将尝试创建一个新文档,该文档将使仅跨越skill和的唯一索引失败resource

尝试将您的更改update为:

ResourceSkillLevel.update({                                           
    resource: self._id,
    skill: skill._id
}, {$set: {level: level}}, {upsert: true}, cb);
于 2013-08-07T18:49:02.240 回答