Saltar al contenido

Mongodb $ búsqueda en Spring data mongo

Posterior a observar en varios repositorios y sitios al final hallamos la respuesta que te compartiremos aquí.

Solución:

Uniendo dos colecciones con Spring Data MongoDB

Clase de empleado

class Employee 
    private String _id;
    private String name;
    private String dept_id;

Departamento Clase

class Department 
    private String _id;
    private String dept_name;

Clase de resultado de empleado

public class EmpDeptResult 

    private String _id;
    private String name;
    private List departments;


Clase de servicio de empleado

public class EmployeeService 

    @Autowired
    private MongoTemplate mongoTemplate;

    private Logger LOGGER = LoggerFactory.getLogger(EmployeeService.class);

    public void lookupOperation()
    LookupOperation lookupOperation = LookupOperation.newLookup()
                        .from("Department")
                        .localField("dept_id")
                        .foreignField("_id")
                        .as("departments");

    Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(Criteria.where("_id").is("1")) , lookupOperation);
        List results = mongoTemplate.aggregate(aggregation, "Employee", EmpDeptResult.class).getMappedResults();
        LOGGER.info("Obj Size " +results.size());
    

No todas las características “nuevas” se convierten inmediatamente en capas de abstracción como spring-mongo.

Entonces, en su lugar, todo lo que necesita hacer es definir una clase que use el AggregationOperation interfaz, que en su lugar tomará un objeto BSON especificado directamente como su contenido:

public class CustomAggregationOperation implements AggregationOperation 
    private DBObject operation;

    public CustomAggregationOperation (DBObject operation) 
        this.operation = operation;
    

    @Override
    public DBObject toDBObject(AggregationOperationContext context) 
        return context.getMappedObject(operation);
    

Entonces puedes usar en tu agregación así:

Aggregation aggregation = newAggregation(
    match(
        Criteria.where("username").is("user001")
    ),
    new CustomAggregationOperation(
        new BasicDBObject(
            "$lookup",
            new BasicDBObject("from", "NewFeedContent")
                .append("localField","content.contentId")
                .append("foreignField", "_id")
                .append("as", "NewFeedContent")
        )
    )
)

Que muestra la clase personalizada mixed con el incorporado match() ayudante de tubería

Todo lo que sucede debajo de cada ayudante es que se serializan en una representación BSON, como con DBObject de todas formas. Entonces, el constructor aquí simplemente toma el objeto directamente y lo devuelve directamente desde .toDBObject()que es el método estándar en la interfaz que se llamará al serializar el contenido de la tubería.

Es demasiado tarde para responder a esto, pero podría ayudar a otros que enfrentan el mismo problema. Si está utilizando spring-boot-data-mongodb-2.0 o una versión superior, hay una manera fácil de implementar esto.

AggregationOperation match = Aggregation.match(Criteria.where("username").is("user001")));
AggregationOperation query = Aggregation.lookup("NewfeedContent", "content.contentId", "_id", "NewfeedContent");
// If you want to unwind
//AggregationOperation unwind = Aggregation.unwind("Patient");
Aggregation agr = Aggregation.newAggregation(query, match, unwind);
AggregationResults result = springTemplate.aggregate(agr, "CollectionName", Document.class);

Te mostramos las comentarios y valoraciones de los lectores

Recuerda que tienes la capacidad de parafrasear si te fue preciso.

¡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 *

Respuestas a preguntas comunes sobre programacion y tecnología