MongoError:E11000重复键错误集合:用户索引:mobile_1 dup键:{mobile:null}

时间:2020-06-03 09:07:56

标签: mongoose mobile collections duplicates key

我创建了一个用户架构,其中有一个移动字段。移动字段应该是唯一的,但仍允许使用空值,并且只能将唯一性与字符串进行比较。这是我的调试信息:

我的用户架构中的“移动”键

mobile: {
  type: String,
  index: {
    unique: true,
    partialFilterExpression: { mobile: { $type: 'string' } }
  },
}

猫鼬调试日志

Mongoose: users.createIndex({ mobile: 1 }, { unique: true, partialFilterExpression: { mobile: { '$type': 'string' } }, background: true})

错误

MongoError: E11000 duplicate key error collection: users index: mobile_1 dup key: { mobile: null }
    at Function.create (~/project/node_modules/mongodb/lib/core/error.js:44:12)
    at toError (~/project/node_modules/mongodb/lib/utils.js:150:22)
    at ~/project/node_modules/mongodb/lib/operations/common_functions.js:265:39
    at handler (~/project/node_modules/mongodb/lib/core/sdam/topology.js:971:24)
    at ~/project/node_modules/mongodb/lib/core/sdam/server.js:496:5
    at ~/project/node_modules/mongodb/lib/core/connection/pool.js:420:18
    at processTicksAndRejections (internal/process/task_queues.js:75:11) {
  driver: true,
  name: 'MongoError',
  index: 0,
  code: 11000,
  keyPattern: { mobile: 1 },
  keyValue: { mobile: null },
  errmsg: 'E11000 duplicate key error collection: users index: mobile_1 dup key: { mobile: null }',
  [Symbol(mongoErrorContextSymbol)]: {}
}

我从stackoverflow尝试了很多选项和不同的答案,但是似乎没有任何效果,所以我想问一下这样做的正确方法。

编辑

问题是我的代码是正确的,但是我必须删除并重新创建表才能使其正常工作。另一个解决方案是只删除索引。

3 个答案:

答案 0 :(得分:2)

问题是我的代码是正确的,但是我必须删除并重新创建表才能使其正常工作。另一个解决方案是只删除索引。

答案 1 :(得分:1)

经过数小时的搜索,我终于找到了问题

问题是我将我保存到一个以前用于另一个应用程序的集合中,该应用程序具有不同的userSchema,该应用程序具有几个独特的参数,例如:phoneNumber, username,...

但是在我目前的模型中,我只有emailpassworduserSchema,而我得到的mongoError code 11000keyPattern: { username: null }

我刚刚在Database_Url文件中更改了.env(我不想在应用程序中进行硬编码的超级机密数据存储在其中):

mongodb://127.0.0.1:27017/myNewCollectionName

并在运行时重新启动节点:

npm start

然后,当我尝试注册用户时,我没有收到该错误,并且此错误已完全解决。

我希望这可以节省您的时间;)

答案 2 :(得分:0)

我认为您需要一个sparse索引。现在,唯一索引意味着您只能有一个user值为空的mobile

来自MongoDB docs on Sparse Indexes

稀疏索引仅包含具有索引字段的文档的条目,即使索引字段包含空值也是如此。索引会跳过缺少索引字段的所有文档。索引是“稀疏的”,因为它不包括集合的所有文档。相比之下,非稀疏索引包含集合中的所有文档,为那些不包含索引字段的文档存储空值。

以下是您的代码的示例

users.createIndex({ mobile: 1 }, { 
  unique: true,  
  sparse: true, 
  partialFilterExpression: { mobile: { '$type': 'string' } }, 
  background: true})