es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Operador Spring Data Reactive Mongo: cómo llamar a la operación “unset” en un campo anidado después de realizar la etapa de búsqueda en un tubería de agregación.

Estoy fusionando registros de dos colecciones projects y card_types en una tubería de agregación y luego intentando eliminar el campo cardFields del registro fusionado del resultado. Entonces la idea es que del resultado agregado que será:

{
   "projectId": "foo",
   ...
   "cardTypes": [
     {
        "itemId": "bar",
        "itemType": "Defect",
        "cardFields": [ { ... más objetos aquí ...} ]
     },
     {
        ... más tipos de tarjeta ...
     }
   ],
}

a

{
   "projectId": "foo",
   ...
   "cardTypes": [
     {
        "itemId": "bar",
        "itemType": "Defect"
        ...
     },
     {
        ... más tipos de tarjeta ...
     }
   ],
}

El método que escribí es:

public Flux<document> getProjectDetails(String enterpriseId, String projectId) {
    AggregationOperation unset = UnsetOperation.unset("cardTypes.cardFields");
    return mongoOperations.aggregate(
            Aggregation.newAggregation(match(where(accountIdKeyName).is(enterpriseId).and(ownerIdKeyName).is(projectId)),
                    lookup("card_types", accountIdKeyName, accountIdKeyName, "cardTypes"),
                    unset), "project", Document.class);
}

El método falla con la excepción:

org.springframework.data.mongodb.UncategorizedMongoDbException: El comando falló con el error 40324 (Location40324): 'Nombre de etapa de tubería no reconocido: $unset'

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    La razón de la excepción es que la etapa del pipeline $unset no es reconocida por la versión del controlador de MongoDB que estás utilizando. Esta etapa del pipeline fue introducida en MongoDB 4.2, por lo que si estás usando una versión inferior de MongoDB, no funcionará.

    Para resolver este problema, puedes actualizar tu instalación de MongoDB a la versión 4.2 o superior, o utilizar un método diferente para eliminar el campo cardFields del registro combinado. Una opción sería utilizar la etapa del pipeline $project y excluir el campo cardFields del resultado. Aquí tienes un ejemplo de cómo podrías modificar tu código para lograr esto:

    public Flux<document> getProjectDetails(String enterpriseId, String projectId) {
        ProjectionOperation project = Aggregation.project().andExclude("cardTypes.cardFields");
        return mongoOperations.aggregate(
                Aggregation.newAggregation(match(where(accountIdKeyName).is(enterpriseId).and(ownerIdKeyName).is(projectId)),
                        lookup("card_types", accountIdKeyName, accountIdKeyName, "cardTypes"),
                        project), "project", Document.class);
    }
    

    Este código reemplaza la etapa del pipeline $unset con una etapa del pipeline $project que excluye el campo cardFields del resultado. El método andExclude se utiliza para especificar el campo a excluir del resultado.

Comments are closed.