我有以下情况: 我正在为我的项目创建一个通用更新功能,该功能获取有效负载并对其进行遍历,检查有效负载中的属性是否存在于模型架构上,如果存在,它将为文档分配新的属性值(更新它)。它也在子文档中执行此操作(递归)。 我有一个用于多语言字符串字段的自定义类型的语言,它是一个包含语言形式的属性(“ en”,“ de”等)的对象。现在,由于其自定义类型,Mongoose不知道其内容是否已修改,因此我必须在其上使用markModified。问题来了:实际的子方案在这里的行为不同于对象。如果我在子模式中调用markModified,则它期望该子模式中的路径,而不是整个文档中的路径。另一方面,如果我在对象上调用markModified,则它期望来自父对象的完整路径。我不知道它是否是一个错误,但是如果我想同时支持这两个功能,则需要在函数中区分两者。有没有办法知道是用户创建的子模式还是仅仅是对象(由猫鼬转换为子模式)?
示例安装模型:
const TestSchema = new Schema(
{
object: {
name: {
type: Language
}
},
nestedSchema: {
type: NestedTestSchema
}
}
)
const NestedTestSchema = new Schema(
{
name: {
type: Language
}
}
)
示例代码:
const testDocument = new TestModel({
object: {
name: {
en: 'NameEN',
de: 'NameDE'
}
}
nestedSchema: {
name: {
en: 'NameEN',
de: 'NameDE'
}
}
})
// We make a payload to change these values
const payload = {
object: { // Update object
name: {
en: 'Name updated',
fr: 'Something',
}
},
nestedSchema: { // Update subschema
name: {
en: 'Name updated',
fr: 'Something',
}
}
}
现在,当我收到此信息并使用这些值更新文档时,对于对象我必须
const { object, nestedSchema } = document // This, of course, is useless here, I would get nestedSchema and object as argument in recursive function, its only for demonstration
nestedSchema.markModified('name.en') // Etc
对于对象我必须
object.markModified('object.name.en') // Etc
答案 0 :(得分:0)
我们与同事一起发现对象不是实际的子模式,它称为nestedPath。只有nestedPaths具有属性$__isNested
,子方案没有。结果,由于两种情况的处理方式不同,在nestedPaths中,当使用markModified
时,我们需要指定完整路径;而在子计划中,则需要指定该子模式中的唯一路径