验证猫鼬中的部分子文档更新

时间:2020-06-15 14:13:03

标签: javascript node.js validation mongoose subdocument

我将Mongoose v5.9.9与节点v14.0.0一起使用,并且当使用save()更新父文档时,我想验证子文档。我发现子文档验证仅在完全替换或完全不修改时执行。如果修改了子文档的单个字段,则调用父文档的save()函数不会触发子文档验证。

考虑此演示模式:

const nestedSchema = new mongoose.Schema({
  B: Number,
  C: Number
})

const schema = new mongoose.Schema({
  A: {
    type: Number,
    validate: {
      validator: (x) => {
        console.log("validating property A")
        return x>0
      }
    }
  },
  subDoc: {
    type: nestedSchema,
    validate: {
      validator: (sub) => {
        console.log("validating subdocument")
        return sub.B > sub.C
      }
    }
  }
})

const Model = mongoose.model('Test', schema);

假设集合中包含以下对象:

{
  _id: 5ee76e6fb00da74f7d4940d9,
  A: 8,
  subDoc: { _id: 5ee7793c03eee160364c5800, B: 10, C: 0 },
  __v: 0
}

以下代码触发对字段A和子文档的验证:

Model.findOne({}).then(async (doc) =>{
   doc["A"] = 8
   doc["subDoc"] = {B:50, C:10}
   doc.validate()
})

但是此代码仅触发A的验证:

Model.findOne({}).then(async (doc) =>{
   doc["A"] = 8
   doc["subDoc"]["B"] = 50
   doc.validate()
})

此代码也只运行A的验证器:

Model.findOne({}).then(async (doc) =>{
   doc.set({"subDoc.B":50, "A":8})
   doc.validate()
})

这是预期的行为吗?有没有办法强制对subDoc进行验证?我想我可以使用一些预验证中间件来验证subDoc,但是我仍然对这种行为感到困惑,并且宁愿直接在架构中使用一些验证器。

0 个答案:

没有答案