我将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,但是我仍然对这种行为感到困惑,并且宁愿直接在架构中使用一些验证器。