Tengo subdocumentos anidados de forma recursiva (matrices), generalmente se parece a:
parent:{ children:[{ field, children:[{ field, children:[{ ... }] }, { field, children:[{ ... }] }, ...] } } Lo que significa que cada subdocumento de children puede tener otros subdocumentos de children anidados.
Estoy tratando de editar un subdocumento (llamémoslo "hijo"). Por ejemplo, quiero editar el niño en el nivel 3. Esto significa que necesito bajar 3 niveles de niños, acceder al niño y guardar el documento (padre).
Lo que estoy haciendo ahora es enviar el nivel a la función, junto con la información que quiero agregar al niño. Encuentro el documento ( findOne a la identificación del padre), bajo los niveles, intento editar al niño y finalmente guardo el documento:
await parentModel.findOne({'_id': parentId}).populate(/*population needed for the information*/) .exec().then(async (result)=>{ let children = result.children; for (let i=0; i<level;i++){ children = children.children; } children.push(child); //in my specific case I simply push the child to the children one level above await result.save((e,doc)=>{...}) Lo que sucede es que veo que children.push(child) tiene éxito, pero el documento no lo guarda (aunque la función de save también tiene éxito).
Supongo que tiene algo que ver con el hecho de que llevo a los children localmente ( let children... ), pero no estoy seguro de si eso es cierto, así que busco consejo.
cuando cambia una matriz anidada, debe "decirle" a mongoose que se cambió, porque de forma predeterminada no la reconoce.
Puede hacer esto usando markModified('fieldName').
ejemplo:
parent ---> a mongooose doc parent.child.push({new child object}); parent.markModified('child); parent.save();