EDIT: After trying many different approaches i found a working solution that maps any object to a format that mongoose understands. See solution here: https://stackoverflow.com/a/69547021/17426304
const updateNestedObjectParser = (nestedUpdateObject) => {
const final = {
}
Object.keys(nestedUpdateObject).forEach(k => {
if (typeof nestedUpdateObject[k] === 'object' && !Array.isArray(nestedUpdateObject[k])) {
const res = updateNestedObjectParser(nestedUpdateObject[k])
Object.keys(res).forEach(a => {
final[`${k}.${a}`] = res[a]
})
}
else
final[k] = nestedUpdateObject[k]
})
return final
}
ORIGINAL QUESTION:
I have a mongoose structure of
ChildSchema = {
childProperty: String,
childProperty2: String
}
MainSchema = {
mainProperty: String,
mainProperty2: String,
child: childSchema
}
In my update function I want to pass a partial object of mainSchema
and only update the properties I pass to the function.
This works fine for direct properties on my mainSchema
but not on my childSchema
. It overwrites the whole child property with the partial object given by my request.
So my update object looks something like this
const updates = {
child: {
childProperty2: 'Example2'
}
}
How can I only update the childProperty2 without deleting the childProperty
?
In this example it would be easy to just update every property alone but the real world objects are much bigger and can be nested into multiple levels.
I tried to use destructuring but it does not seem to work
const example = MainSchema.findOne({_id})
if (updates.child) example.child = {...example.child, ...updates.child} // Does not work
Is there a solution to that in mongoose (6.0)?