使用空数组添加新用户记录时出现“E11000 重复键错误收集”

Posted

技术标签:

【中文标题】使用空数组添加新用户记录时出现“E11000 重复键错误收集”【英文标题】:"E11000 duplicate key error collection" when adding new user record with an empty array 【发布时间】:2021-01-31 04:00:22 【问题描述】:

我正在处理我的第一个全栈 MERN 项目,并且可以使用一些帮助。我想在 MongoDB 中有一个用户集合,每个用户都从一个空数组开始。但是,当我尝试发布新用户时收到以下错误消息:

MongoError: E11000 重复键错误集合:learnGreek.users 索引:words.greek_1 复制键: words.greek: null

关于我正在努力实现的目标。我正在尝试制作一个希腊语学习应用程序,用户可以在其中添加自己的单词,然后对他们添加的单词进行测验。我想记录用户连续正确使用单词的次数和最后一次他们处理这个词的时间。因此,我当前的模型和架​​构如下所示:

const wordSchema = new Schema(
  "greek": 
    "type": String,
    "required": true,
    "trim": true,
    "minlength": 1
  ,
  "english": 
    "type": String,
    "required": true,
    "minlength": 1
  ,
  "success":
      "type": Number,
      "required": true
  ,
  "timeStamp":
      "type": Date,
      "required":true
  
);

const userSchema = new Schema(
  eMail: 
    type: String,
    required: [true, "Please Enter an e-mail"],
    trim: true,
    minlength: 3,
    validate: [isEmail, "please enter a valid-email"],
    unique: true
  ,
  password: 
    type: String,
    required: [true, "Please Enter a password"],
    trim: true,
    minlength: [8, '"Minminum password length is 8 characters'],
  ,
  words: [wordSchema]
);

我第一次使用这个模型时,一切正常,但从那以后我每次都收到“E11000 重复密钥错误收集”错误。现在当我用谷歌搜索这个错误消息时,我读到(并理解)了这个问题是 Mongoose 拒绝了我的新用户,因为他们的空词数组不是唯一的。提出的一种解决方案是将稀疏属性添加到我的模式中,但我不确定在我的模式中的何处使用它。我试过了……

words: [wordSchema] , sparse: true 

...但这给了我一个语法错误。

我也试过

const wordSchema = new Schema(
  **"sparse":true,**
  "greek": 
    "type": String,
    "required": true,
    "trim": true,
    "minlength": 1
  ,
  "english": 
    "type": String,
    "required": true,
    "minlength": 1
  ,
  "success":
      "type": Number,
      "required": true
  ,
  "timeStamp":
      "type": Date,
      "required":true
  
);

但随后我收到以下错误消息:

TypeError:无效的架构配置:True 不是路径 sparse 上的有效类型。有关有效架构类型的列表,请参阅 snip

对我来说,保存每个用户的最佳方式是什么,以便他们从一个空数组开始,他们将使用他们自己的单词填充,一旦他们开始使用应用程序就会添加这些单词?

【问题讨论】:

【参考方案1】:

words.greek 字段上定义了一个唯一索引。可能,您使用unique: true 定义了架构并且索引仍在数据库中?如果您不需要 greek 字段唯一,删除索引是最简单的解决方案。

如果您确实需要此字段的唯一性,sparse 有效,因为稀疏索引不包括字段值为 null 或不存在的文档。要指定sparse,请执行以下操作:

const wordSchema = new Schema(
  "greek": 
    "type": String,
    "required": true,
    "trim": true,
    "minlength": 1,
    "index":  "unique": true, "sparse": true 
  
...

【讨论】:

感谢您的帮助!我将如何删除索引? 其实我只是想通了并且能够实施解决方案。非常感谢! 您可以使用await WordModel.syncIndexes() 确保根据架构定义更新索引。

以上是关于使用空数组添加新用户记录时出现“E11000 重复键错误收集”的主要内容,如果未能解决你的问题,请参考以下文章

插入期间:E11000 重复键错误索引

尝试开始新活动时出现空指针异常

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

添加指向数组的指针时出现分段错误

添加单元格和使用 UITableView 滚动时出现图形故障

使用 Microsoft Graph 为日历创建新事件时出现空异常