Saltar al contenido

¿Cómo puedo implementar la consulta addFields mongoDB en Java?

Recabamos por distintos espacios y así de este modo brindarte la solución a tu dilema, si continúas con dificultades puedes dejar la inquietud y te responderemos sin falta.

Solución:

Estás mezclando el controlador de Java Aggregates método con Spring Aggregation métodos.

También $addFields es todavía not supported en primavera mongo.

Tienes que usar la siguiente agregación.

import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
Aggregation myDocAggr = newAggregation(
       match(Criteria.where("metaId.ref.uuid").is(someUUID)), 
       group("uuid").max("version").as("version"),
       lookup("simple","execId.ref.uuid","uuid","simple"),
       unwind("simple"),
       new AggregationOperation() 
         @Override 
         public Document toDocument(AggregationOperationContext aoc) 
            return new Document("$addFields",new Document("metaId.ref.name","$simple.name"));
         
      
)
List mydocumentList=mongoTemplate.aggregate(myDocAggr,"myDocument",Document.class).getMappedResults();

Aunque Spring Mongo no admite $addFields, puede implementarlo usted mismo:

import org.bson.Document;
import org.springframework.data.mongodb.core.aggregation.*;
import java.util.LinkedHashMap;
import java.util.Map;

public class AddFieldsOperation implements FieldsExposingAggregationOperation {
    private Map fields = new LinkedHashMap<>();

    public AddFieldsOperation(String field, AggregationExpression expression) 
        addField(field, expression);
    

    public AddFieldsOperation addField(String field, AggregationExpression expression) 
        this.fields.put(field, expression.toDocument(Aggregation.DEFAULT_CONTEXT));
        return this;
    

    @Override
    public Document toDocument(AggregationOperationContext context) 
        Document doc = new Document();
        fields.forEach(doc::append);
        return new Document("$addFields", doc);
    

    @Override
    public boolean inheritsFields() 
        return true;
    

    @Override
    public ExposedFields getFields() 
        final String[] fieldsArray = fields.keySet().toArray(new String[0]);
        return ExposedFields.synthetic(Fields.fields(fieldsArray));
    

Y utilízalo así:

...
ArithmeticOperators.Add value1 = ArithmeticOperators.Add.valueOf(0);
ArithmeticOperators.Add value2 = ArithmeticOperators.Add.valueOf(0);
AddFieldsOperation addFields
            = new AddFieldsOperation("value1", value1)
            .addField("value2", value2);
pipeline.add(addFields);
...
Add value1PlusValue2 = Add.valueOf("$value1").add("$value2");
...

Espero que ayude a alguien.

Desde la versión 3.0 de ‘spring-data-mongodb’, es posible crear una agregación AddField muy fácilmente. Puede utilizar AddFieldsOperationBuilder.

En el siguiente ejemplo, agrego un string campo id para el campo objectId llamado _id. los string campo idString puede usarse en una agregación de búsqueda.

Ejemplo:

    AddFieldsOperation addFieldsOperation = Aggregation.addFields().addFieldWithValue("idString", ConvertOperators.ToString.toString("$_id")).build();

Puntuaciones y comentarios

Si te ha resultado de ayuda nuestro post, agradeceríamos que lo compartas con más desarrolladores de este modo nos ayudas a dar difusión a este contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *