Se requiere un par de rectificaciones en la consulta, de lo contrario, ya casi está. La actualización no funciona porque $elemMatch
para attributeSet
(matriz de documentos) el campo debe ocurrir en id
propiedad de esos documentos para filtrar y no en attributeSet.id , no se daría cuenta de lo que es. Y no se requiere elemMatch anidado, simplemente use la notación de puntos .
Para depurar, puede probarlo con una consulta de búsqueda.
Consulta (Shell):
db.collection.findOneAndUpdate(
{
_id: settingsToBeUpdated._id,
attributeSet: {
$elemMatch: {
id: attributeSetId,
"attributes.id": id
}
}
},
{
$set: {
"attributeSet.$[as].attributes.$[a].attributeName":
attributeDto.attributeName,
"attributeSet.$[as].attributes.$[a].defaultValue":
attributeDto.defaultValue,
"attributeSet.$[as].attributes.$[a].isRequired": attributeDto.isRequired
}
},
{
arrayFilters: [{ "as.id": attributeSetId }, { "a.id": id }],
returnNewDocument: true
}
);