Node.js Mongoose-使用unique:true和默认值:null

Node.js Mongoose-使用unique:true和默认值:null,node.js,mongoose,model,Node.js,Mongoose,Model,我有一个用mongoose创建的用户模型,我希望记录中有没有电子邮件。在用户有电子邮件的情况下,我希望它是唯一的,但在另一种情况下,当字段为空时,它将不会是唯一的,因为多个用户可以决定不提供电子邮件。是否有一种方法允许具有null值的副本,但拒绝任何其他副本 我目前有一个带有电子邮件字段的用户模式,如下所示: const user_schema = new mongoose.Schema({ email: { type: String, unique: true, d

我有一个用mongoose创建的用户模型,我希望记录中有没有电子邮件。在用户有电子邮件的情况下,我希望它是唯一的,但在另一种情况下,当字段为空时,它将不会是唯一的,因为多个用户可以决定不提供电子邮件。是否有一种方法允许具有
null
值的副本,但拒绝任何其他副本

我目前有一个带有电子邮件字段的用户模式,如下所示:

const user_schema = new mongoose.Schema({
  email: {
    type: String,
    unique: true,
    default: null,
    sparse: true
  }
})
执行此操作时,我会收到以下错误:
E11000重复密钥错误集合:db.users索引:email_1 dup key:{email:null}

我甚至尝试过创建这样的索引:

user_schema.index({ email: 1 }, { unique: true, sparse: true })


Null仍然是一个值,如果字段是唯一的,则不能复制。如果用户未提供电子邮件,您可以添加一个唯一值,如(uuid)@noemail。谢谢您的回答,但如果该字段不能有随机值且必须为空,该怎么办?此外,我忘了提到电子邮件字段的唯一性取决于用户决定选择的帐户类型。类型fiels是一个枚举字段。是否可以根据其他字段的值确定电子邮件字段的唯一性?您必须在唯一性和空值之间进行选择。不能两者兼得。对于不同的类型,您可能有不同的mongoose模型。您应该根据需要指定电子邮件并检查其唯一性,或者根本没有这些选项。如果用户未提供电子邮件,但忘记其UniquencesNull仍然是一个值,并且如果字段是唯一的,则无法复制,则可以设置默认电子邮件。如果用户未提供电子邮件,您可以添加一个唯一值,如(uuid)@noemail。谢谢您的回答,但如果该字段不能有随机值且必须为空,该怎么办?此外,我忘了提到电子邮件字段的唯一性取决于用户决定选择的帐户类型。类型fiels是一个枚举字段。是否可以根据其他字段的值确定电子邮件字段的唯一性?您必须在唯一性和空值之间进行选择。不能两者兼得。对于不同的类型,您可能有不同的mongoose模型。您应该根据需要指定电子邮件并检查其唯一性,或者根本没有这些选项。如果用户未提供电子邮件,但忘记其唯一性,则可以设置默认电子邮件
user_shema.index(
  { email: 1 },
  { unique: true, partialFilterExpression: { email: { $exists: true } } }
)