Mongoose upsert 重复键错误

Posted

技术标签:

【中文标题】Mongoose upsert 重复键错误【英文标题】:Mongoose upsert duplicate key error 【发布时间】:2013-08-09 06:53:47 【问题描述】:

我正在尝试使用 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。列出的重复键是元组资源/技能键。为什么找到重复项时不更新插入?

【问题讨论】:

【参考方案1】:

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

尝试将您的 update 更改为:

ResourceSkillLevel.update(                                           
    resource: self._id,
    skill: skill._id
, $set: level: level, upsert: true, cb);

【讨论】:

以上是关于Mongoose upsert 重复键错误的主要内容,如果未能解决你的问题,请参考以下文章

带有 upsert 的 Mongoose 重复键错误

Mongodb/Mongoose bulkwrite(upsert) 性能问题

使用 mongoose 钩子重试保存重复键错误

Mongoose - 由 :: 11000 E11000 重复键错误索引引起?

Mongoose - 由 :: 11000 E11000 重复键错误索引引起?

Mongoose + Expressjs - E11000 重复键错误索引?