【问题标题】:Can a Schema use it's own model to validate?Schema 可以使用它自己的模型进行验证吗?
【发布时间】:2013-03-04 21:07:25
【问题描述】:

例如,假设我有一个用户架构,并且我想在尝试将用户保存到数据库之前验证用户名是否唯一。

...

UserSchema.path('username')
  .validate(function (value, respond) {
    User.findOne({ username: this.username }) // This isn't valid.
      .lean()
      .select('_id')
      .exec(function (err, user) {

        if (err) {
          winston.warn('User_username: Error looking for duplicate users');
          respond(false);
        }

        // If a user was returned, then the user is non-unique!
        if (user) {
          respond(false);
        }

        respond(true);
      });
  });

...

var User = mongoose.model('User', UserSchema);

我知道我可以使用mongoose.model('User').findOne(...),但这似乎有点傻,没有更好的方法吗?

【问题讨论】:

    标签: node.js mongoose


    【解决方案1】:

    您可以通过设置unique: true 在架构中创建唯一索引。这将利用 mongodb 中可用的唯一索引选项。这是我的一个模型中使用此选项的示例 sn-p:

    // The (generated) uniform resource locator
    url: {
        // ... which is required ...
        required: true,
        // ... which is an unique index ...
        unique: true,
        // ... and is a string.
        type: String
    }
    

    来自 cmets 的复合键:

    Schema.index({ username: 1, accountCode: 1 }, { unique: true })
    

    【讨论】:

    • 我的例子被简化了一些;我实际上有两个属性,当它们组合在一起时,它们需要是唯一的。 usernameaccountCode,这样用户名在绑定的帐户上也是唯一的。另外,您描述的方法会返回ValidationError 吗?还是MongoError
    • 您可以创建复合索引来执行多个字段的唯一验证,如下所示:Schema.index({ username: 1, accountCode: 1 }, { unique: true }) 但是它会抛出 MongoError,而不是 ValidationError
    • 是的,这是我的问题,我已经在 Schema 上创建了一个复合索引,但我认为在保存之前验证没有重复条目是有好处的。跨度>
    • @matthewtole 有正确的复合键方式。除了获得更优雅的错误消息之外,进行自己的验证并没有真正的好处,但是并发仍然可以让您陷入 mongodb 错误。没有额外的好处。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-30
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    相关资源
    最近更新 更多