sql >> Base de Datos >  >> NoSQL >> MongoDB

Actualizar el elemento de matriz anidado en mongodb

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