У меня следующая ситуация: я создаю функцию обновления общего назначения для своего проекта, которая принимает полезную нагрузку и проходит через нее, проверяя, существует ли свойство в полезной нагрузке в схеме модели, и если оно есть, оно присваивает новое значение свойства документу (обновляя его). Это делается также в поддокументах (рекурсивно). У меня есть настраиваемый тип Language для многоязычных строковых полей, который представляет собой объект, содержащий свойства в форме языка ('en', 'de', et c). Теперь, поскольку это настраиваемый тип, Mon goose не знает, было ли изменено его содержимое, поэтому я должен использовать для него markModified. И здесь возникает проблема: реальные подсхемы ведут себя здесь иначе, чем объекты. Если я вызываю markModified для подсхемы, он ожидает путь внутри этой подсхемы, а не всего документа. С другой стороны, если я вызываю markModified для объекта, он ожидает от родителя весь путь. Я не знаю, ошибка это или нет, но если я хочу поддерживать и то, и другое, мне нужно различать их в моей функции. Есть ли способ узнать, является ли это подсхема, созданная пользователем, или просто объект (который был преобразован в подсхему с помощью mon goose)?
Пример модели установки:
const TestSchema = new Schema(
{
object: {
name: {
type: Language
}
},
nestedSchema: {
type: NestedTestSchema
}
}
)
const NestedTestSchema = new Schema(
{
name: {
type: Language
}
}
)
Пример code:
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