多个字段:Mongodb重复键:{...,null}

rlcwz9us  于 2023-11-17  发布在  Go
关注(0)|答案(1)|浏览(123)

对于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);


谁可以帮助解决问题?

j2cgzkjk

j2cgzkjk1#

在模式中,“email”和“username”都被标记为唯一的,因此在mongod服务器中的集合上将创建一个索引,以强制执行该唯一性。
当文档中不包含字段时,索引将在构建索引条目时使用null作为该字段的值。
由于“accountType”不是“email”时不需要“email”字段,因此它不会总是存在。由于唯一索引不允许超过1个以null为值的条目,这意味着您只能有1个不包含电子邮件地址的文档。“username”也是如此。
你可以通过声明索引是稀疏的来解决这个问题。这意味着如果文档中不存在该字段,那么索引中就没有该文档的条目。
您可以通过在模式中为每个字段显式传递索引选项来指定:
index: { unique: true, sparse: true }

相关问题