【问题标题】:Mongoose schema validation when updating the document更新文档时的 Mongoose 模式验证
【发布时间】:2022-01-15 02:06:36
【问题描述】:

您好,我有一个用于蛞蝓的猫鼬模式。我想检查它的唯一性

slug: {
  type: String,
  default: "",
  trim: true,
  validate: {
    validator: async function (value) {
      const user = await this.model.findOne({ slug: value });
      console.log(user);
      console.log(this);
      if (user) {
        if (this.id === user.id) {
          return true;
        }
        return false;
      }
      return true;
    },
    message: (props) => "This slug is already in use",
  },
},

在插入新文档时,此验证工作正常,但在更新案例时,我想将其与架构中除自身之外的所有其他字段进行比较。我怎么能这样做

I have also added runValidators to check validation when updating also

CMS.pre("findOneAndUpdate", function () {
  this.options.runValidators = true; 
});

如果您能建议一种在插入和更新时检查 mongoose 中 slug 唯一性的更好方法

提前致谢

【问题讨论】:

  • 这种方式有什么问题?你遇到什么问题了吗?
  • 插入时工作正常,但在更新时将 slug 与我正在尝试更新的当前文档进行比较,并给出验证错误,希望跳过当前文档并仅与其他文档进行比较

标签: node.js mongodb express validation mongoose


【解决方案1】:

为什么要使用验证器?为什么不通过定义索引来确保 slug 是唯一的?

const User = new Schema({
    slug: {
        type: String,
        default: "",
        trim: true,
        unique: true,
    }
});

您需要在尝试插入已经存在的用户时捕获错误,因为the the unique option is not a validator。见:How to catch the error when inserting a MongoDB document which violates an unique index?

参考:

【讨论】:

  • 是的,这是正确的,但如果我也想将验证器用于其他目的,有什么方法可以获取当前文档和更新的文档,以便比较它们的 id 或其他内容跨度>
  • 这不是您最初问题的一部分。我建议您使用unique 创建索引,然后添加一个额外的验证器。要比较文档,您可以使用在保存/更新之前触发的钩子:mogoose docs。 Hooks 在 `validate.见:mongoose-difference-between-pre-save-and-validate-when-to-use-which-one。我建议你让自己更熟悉猫鼬的工作原理。
猜你喜欢
  • 2017-10-06
  • 2020-08-26
  • 2016-05-08
  • 2013-12-16
  • 2011-12-21
  • 2013-11-13
  • 2016-10-03
  • 2019-06-03
  • 2014-09-15
相关资源
最近更新 更多