MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mettre à jour l'élément de tableau imbriqué dans mongodb

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
  }
);