当创建新文档然后尝试向上插入新的子文档时,出现此错误:

Object {error: "E11000 duplicate key error index: sales.users.$gro…p key:
        { : ObjectId('537b7788da19c4601d061d04') }"}
error: "E11000 duplicate key error index: sales.users.$groups.groupId_1
        dup key: { : ObjectId('537b7788da19c4601d061d04') }"
__proto__: Object

我要插入的子文档定义为具有groupId字段且要求{unique:true},{sparse:true}的子模式。我正在使用的 Mongoose 方法调用是:
User.findByIdAndUpdate(userId,
                       { $push: { 'groups': userUpdate} },
                       function (err, obj) where userUpdate = { groupId: groupId }.

删除索引后,问题得以解决,并且不再发生此错误。
var UserSchema = new Schema({
    email: {
        type: String,
        required: true,
        unique: true
    },
    active: {
        type: Boolean,
        default: true
    },
    username: {
        type: String,
        required: true,
        unique: true
    },
    password: {
        salt: {
            type: String,
            required: true
        },
        hash: {
            type: String,
            required: true
        }
    },
    securityQuestion: {
        question: String,
        salt: String,
        hash: String
    },
    mobile: {
        PIN: Number,
        Number: Number
    },
    createDate: {
        type: Date,
        default: Date.now
    },
    updateDate: Date,
    lastLoginDate: Date,
    prevLoginDate: Date,
    passChangeDate: Date,
    locked: Boolean,
    lockDate: Date,
    failedCount: Number,
    failedDate: Date,
    profile: profile,
    preference: preference,
    courses: [UserCourseSchema],
    groups: [UserGroupSchema],
    rewards: [UserRewardSchema],
    roles: UserRoleSchema,
    scores: [UserScoreSchema]
});

var UserGroupSchema = new Schema({
    groupId: {
        type: Schema.Types.ObjectId,
        unique: true,
        sparse: true
    },
    joinDate: {
        type: Date,
        default: Date.now
    },
    receiveNotifications: {
        type: Boolean,
        default: true
    },
    isAdmin: {
        type: Boolean,
        default: false
    },
    isOwner: {
        type: Boolean,
        default: false
    },
    isModerator: {
        type: Boolean,
        default: false
    },
    updateDate: Date
});

最佳答案

如果要对对象数组应用upsert,则将始终创建新文档,因为它不比较数组的子文档,并且组id上具有唯一索引,因此不允许您创建具有相同值的新记录。为此,您应该找到该记录,如果存在,则对其进行更新,否则创建新记录。

另一个最佳方法是使用 $ addToSet
希望这可以帮助。

09-12 06:45
查看更多