猫鼬:根据查询动态添加验证器的某些参数

时间:2018-08-15 17:47:09

标签: node.js mongodb mongoose mongoose-schema

我是Mongoose的新手,并且想知道是否有可能根据查询动态添加一些参数的验证器。例如,我有一个如下所示的模式:

var user = new Schema({
     name: { type: String, required: true },
     email: { type: String, required: true },
     password: { type: String, required: true },
     city: { type: String },
     country: { type: String }
});

对于简单的注册,我强迫用户提供名称,电子邮件和密码。顶部的架构是确定的。现在稍后,我想强迫用户提供城市和国家。 例如,是否可以根据需要使用参数city和country更新用户的文档?我避免重复如下的用户模式:

var userUpdate = new Schema({
     name: { type: String },
     email: { type: String },
     password: { type: String },
     city: { type: String, required: true },
     country: { type: String, required: true }
});

2 个答案:

答案 0 :(得分:1)

在这种情况下,您需要做的是拥有一个模式,并使您的required成为允许nullString的函数:

var user = new Schema({
  name: {
    type: String,
    required: true
  },
  email: {
    type: String,
    required: true
  },
  password: {
    type: String,
    required: true
  },
  city: {
    type: String,
    required: function() {
      return typeof this.city === 'undefined' || (this.city != null && typeof this.city != 'string')
    }
  }
});

您可以提取它并使其成为外部函数,然后将其用于county等。

这是强制性的,但是您也可以为其设置null。这样,您可以在开始时将其设置为null,然后在以后进行设置。

Here is the doc on required

答案 1 :(得分:1)

据我所知,不,这是不可能的。

猫鼬模式是在集合而非文档上设置的。 您可能有2个猫鼬模型指向具有不同Schema的同一集合,但这实际上需要具有重复的Schema。

就您个人而言,我会创建一个单一的自制模式,例如数据结构和一个函数,当将其提供给数据结构时,将创建两个版本的Schema。

例如:

const schemaStruct = {
    base : {
      name: { type: String, required: true },
      email: { type: String, required: true },
      password: { type: String, required: true },
      city: { type: String },
      country: { type: String }
    }
    addRequired : ["city", "country"]
}
function SchemaCreator(schemaStruct) {
     const user = new Schema(schemaStruct.base)

     const schemaCopy = Object.assign({}, schemaStruct.base)
     schemaStruct.addRequired.forEach(key => {
          schemaCopy[key].required = true;
     })
     const updateUser = new Schema(schemaCopy);
     return [user, updateUser];
}