当创建新的文档,然后尝试提出一个新的子文档我得到这个错误:
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
我试图插入的子文档被定义为子模式,它具有一个需要{unique:true},{sparse:true}的groupId字段.我正在使用的东西方法调用是:
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,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,receiveNotifications: { type: Boolean,isAdmin: { type: Boolean,default: false },isOwner: { type: Boolean,isModerator: { type: Boolean,updateDate: Date });
解决方法
如果您在对象数组上应用upsert,那么它将始终创建新文档,因为它不比较数组的子文档,并且在groupId上具有唯一的索引,因此不允许您创建具有相同值的新记录.为此,您应该找到该记录,如果存在,则更新它创建新记录.
另一个最好的方法是使用$addToSet.希望这可以帮助.