Quelques rectifications requises sur la requête, sinon c'est presque là. La mise à jour ne fonctionne pas car $elemMatch
pour attributeSet
(tableau de documents) doit se produire sur id
propriété de ces documents à filtrer et non sur attributeSet.id , il ne comprendrait pas ce que c'est. Et elemMatch imbriqué n'est pas requis, utilisez simplement la notation par points .
Pour déboguer, vous pouvez l'essayer avec une requête de recherche.
Requête (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
}
);