对于accountType = email,email设置为唯一,对于accountType = username,username也设置为唯一。Mongodb为accountType = username发送此。键不是{ username:“username”}
"err": "E11000 duplicate key error collection: painPoint.users index: email_1 dup key: { email: null }",
{
"error": {
"index": 0,
"code": 11000,
"keyPattern": {
"email": 1
},
"keyValue": {
"email": null
}
}
字符串
电子邮件密钥是正确的,但取决于我首先创建的帐户。
"err": "E11000 duplicate key error collection: painPoint.users index: email_1 dup key: { email: \"[email protected]\" }",
"error": {
"index": 0,
"code": 11000,
"keyPattern": {
"email": 1
},
"keyValue": {
"email": "[email protected]"
}
}
}
型
我希望两者都返回正确的键值,我不知道是什么原因导致了这一点,因为这两个字段在模式定义中都被设置为唯一的。
我的架构
import mongoose from "mongoose";
const UserSchema = new mongoose.Schema({
email: {
type: String,
unique: [true, "Email already exists"],
required: [
function () {
return this.accountType === "email";
},
"Email is required",
],
},
username: {
unique: [true, "Username already exists"],
type: String,
required: [
function () {
return this.accountType === "username";
},
"Username is required",
],
},
name: {
type: String,
required: [
function () {
return this.accountType === "email";
},
"Name is required",
],
},
accountType: {
type: String,
required: true,
enum: ["username", "email", "google"],
},
password: { type: String, required: true },
since: { type: Date, default: Date.now },
injuries: [{ type: mongoose.Schema.Types.ObjectId, ref: "Injury" }],
});
export default mongoose.models.User || mongoose.model("User", UserSchema);
型
谁可以帮助解决问题?
1条答案
按热度按时间j2cgzkjk1#
在模式中,“email”和“username”都被标记为唯一的,因此在mongod服务器中的集合上将创建一个索引,以强制执行该唯一性。
当文档中不包含字段时,索引将在构建索引条目时使用
null
作为该字段的值。由于“accountType”不是“email”时不需要“email”字段,因此它不会总是存在。由于唯一索引不允许超过1个以
null
为值的条目,这意味着您只能有1个不包含电子邮件地址的文档。“username”也是如此。你可以通过声明索引是稀疏的来解决这个问题。这意味着如果文档中不存在该字段,那么索引中就没有该文档的条目。
您可以通过在模式中为每个字段显式传递索引选项来指定:
index: { unique: true, sparse: true }
个