EDITAR: después de probar muchos enfoques diferentes, encontré una solución funcional que asigna cualquier objeto a un formato que la mangosta entiende. Vea la solución aquí: 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 }PREGUNTA ORIGINAL:
Tengo una estructura de mangosta de
ChildSchema = { childProperty: String, childProperty2: String } MainSchema = { mainProperty: String, mainProperty2: String, child: childSchema } En mi función de actualización, quiero pasar un objeto parcial de mainSchema y solo actualizar las propiedades que paso a la función. Esto funciona bien para propiedades directas en mi mainSchema pero no en mi childSchema . Sobrescribe toda la propiedad secundaria con el objeto parcial proporcionado por mi solicitud.
Así que mi objeto de actualización se parece a esto
const updates = { child: { childProperty2: 'Example2' } } ¿Cómo puedo actualizar solo childProperty2 sin eliminar childProperty ? En este ejemplo, sería fácil actualizar cada propiedad por separado, pero los objetos del mundo real son mucho más grandes y se pueden anidar en varios niveles.
Intenté usar la desestructuración pero parece que no funciona.
const example = MainSchema.findOne({_id}) if (updates.child) example.child = {...example.child, ...updates.child} // Does not work¿Hay una solución para eso en mongoose (6.0)?
Cambia tu código así:
const updates = { "child.childProperty2": 'Example2' }