Tengo dos esquemas:
Org
const schemaOrg= new Schema({ name: String, atts: [schemaAtt], });y att
const schemaAtt = new Schema( { isActive: Boolean, name: String, description: String, color: String, icon: String, } );Si intento actualizar Atts de un documento de la organización
const updateAtt = async (parent, { input }) => { const attId = input.id; const orgId = input.orgId; const res= await modelOrg.findOneAndUpdate( { _id: orgId, 'atts._id': attId }, {$set:{'atts.$':input}}, { returnDocument: 'after', projection: { _id: 0, atts: 1 }, } ); return res.atts; };con la siguiente entrada:
{ "input": { "id":"61799ab734465282d39a6570", "organizationId":"615ca4d39a35776c189c1324", "isActive": true, "description": "AC des11", "icon":"wrench" } }este es el resultado:
{ "id": "6179bd08c35a27df069bd2f4", "name": null, "isActive": true, "description": "AC des11", "color": null, "icon": "wrench" }En primer lugar, se cambia la identificación!!! y lo que no envié cambió a nulo (color)
La depuración de mongoose muestra que se ejecuta el siguiente comando
orgs.findOneAndUpdate({ _id: new ObjectId("615ca4d39a35776c189c1324"), 'atts._id': new ObjectId("61799ab734465282d39a6570")}, { '$set': { 'atts.$': { isActive: true, description: 'AC des11', icon: 'wrench', _id: new ObjectId("6179bd08c35a27df069bd2f4"), name: [] } }}, { returnDocument: 'after', upsert: false, remove: false, projection: { _id: 0, atts: 1 }, returnOriginal: false})tengo 2 preguntas:
{ 'atts.$.isActive': input.isActive, 'atts.$.name': input.name, 'atts.$.description': input.description, 'atts.$.color': input.color, 'atts.$.icon': input.icon, }, en lugar de {$set:{'atts.$':input}}, entonces la actualización está funcionando. ¿Cómo puedo pasar la entrada en lugar de los campos uno por uno?
Gracias por adelantado.