para la siguiente colección:
id: Number name:[ new Schema({ language: { type: String, enum: ['en-US', 'fr-CA'] }, text: String, },{ _id: false } ); ], isActive: Booleany muestra datos como los siguientes:
{ id:1, "name": [ {"language": "en-US", "text": "Book"}, {"language": "fr-CA", "text": "livre"} ], isActive:true // and so many other fields }, { id:2, "name": [ {"language": "en-US", "text": "Pen"} ], isActive:true // and so many other fields }Me gustaría actualizar el documento por Id: 1 y cambiar el texto solo para francés, lo intenté con:
const input={ "id":"1", "isActive": false} const name= { "name": [{"language": "fr-CA", "text": "Nouvel article"}]} await langs.findByIdAndUpdate( { _id: input.id }, { ...input, $addToSet: { name } }, { new: true, upsert: true } );pero el resultado es: (se agregó otro elemento en francés)
{ id:1, "name": [ {"language": "en-US", "text": "Book"}, {"language": "fr-CA", "text": "livre"}, {"language": "fr-CA", "text": "Nouvel article"} ], isActive:false },Esto se basa en el comentario británico:
https://mongoplayground.net/p/atlw5ZKoYiI
Por favor avise.
Siempre que ese atributo ya exista en el documento, puede hacer algo como:
Collection.findOneAndUpdate({id: 1}, { $set: { "name.$[elem]": name } }, { arrayFilters: [ { "elem.language": name.language } ], upsert: true, new: true })