我创建了一个用户架构,其中有一个移动字段。移动字段应该是唯一的,但仍允许使用空值,并且只能将唯一性与字符串进行比较。这是我的调试信息:
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尝试了很多选项和不同的答案,但是似乎没有任何效果,所以我想问一下这样做的正确方法。
编辑
问题是我的代码是正确的,但是我必须删除并重新创建表才能使其正常工作。另一个解决方案是只删除索引。
答案 0 :(得分:2)
问题是我的代码是正确的,但是我必须删除并重新创建表才能使其正常工作。另一个解决方案是只删除索引。
答案 1 :(得分:1)
经过数小时的搜索,我终于找到了问题
问题是我将我保存到一个以前用于另一个应用程序的集合中,该应用程序具有不同的userSchema
,该应用程序具有几个独特的参数,例如:phoneNumber, username
,...
但是在我目前的模型中,我只有email
和password
为userSchema
,而我得到的mongoError code 11000
和keyPattern: { 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})