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'
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 campocardFields
del resultado. Aquí tienes un ejemplo de cómo podrías modificar tu código para lograr esto:Este código reemplaza la etapa del pipeline
$unset
con una etapa del pipeline$project
que excluye el campocardFields
del resultado. El métodoandExclude
se utiliza para especificar el campo a excluir del resultado.