如何在mongoose模型上使用partialFilterExpression

4sup72z8  于 2023-10-19  发布在  Go
关注(0)|答案(4)|浏览(137)

我创建了一个mongoose模型,它有一个email字段。我希望它是唯一的,如果一个值是由用户提供的,但我希望它是空的,是一个用户没有提供任何值。我在这里找到了一个很好的mongodb参考:https://docs.mongodb.com/manual/core/index-partial/#partial-index-with-unique-constraints,可以工作,但我不知道如何使它的工作 Mongoose
这就是现在的情况

email: {
    type: String,
    index: true,
    unique: true
  }

如果我让它的方式,我不能创建多个文档与空/空电子邮件字段

0mkxixxg

0mkxixxg1#

在电子邮件路径级别,您只能使用:

email: {
  type: String
}

在模式级别中,用途:

SchemaName.index({ email: 1 }, {
  unique: true,
  partialFilterExpression: {
    'email': { $exists: true, $gt: '' }
  }
});

这样,只有当电子邮件存在且不是空字符串时,才应用唯一约束

blmhpbnm

blmhpbnm2#

你可以有这样的东西:

email: {
    type: String,
    index: {
      unique: true,
      partialFilterExpression: { email: { $type: 'string' } },
    },
    default : null
  }

但在你真正实现它之前,请阅读下面的链接,因为默认值似乎只适用于新的文档插入:
Mongoose v5.6.9 Documentation

sbtkgmzw

sbtkgmzw3#

可以使用sparse

email: {
  type: String,
  unique: true,
  sparse: true
}

这样,如果你根本不发送email字段,mongo不会自动为该字段添加空值。它只会跳过它。

w1jd8yoj

w1jd8yoj4#

尝试为字段topic创建TTL索引,该字段与值DTCPDM匹配。
运行此命令后,将创建新的TTL索引,名称为test_index
结果:所有超过120秒且字段值为DTCPDM的文档将被删除。

db.collection.createIndex( { received: 1 }, { partialFilterExpression: { topic: { $eq: "DTC" }, topic: { $eq: "PDM"} }, expireAfterSeconds: 120, name: "test_index" })

相关问题