Ordenar los resultados de MongoDB usando Spring Boot con MongoTemplate

Aug 16 2020

La meta

Me gustaría tener esta consulta:

db.getCollection("employees").find().sort({
  hire_date: 1
}).limit(10)

escrito con MongoTemplate en Spring Boot.

La investigación

He visto muchas publicaciones y sitios sobre clasificación como, por ejemplo,

  • https://www.baeldung.com/java-mongodb-aggregations
  • Spring + MongoDB - MongoTemplate + Consulta de criterios
  • Clasificación de consultas Spring MongoDB

Intentos

Lo he intentado de muchas maneras, pero todavía no puedo entender cómo puedo hacer esto. Algunas de las cosas que he probado se enumeran a continuación:

@Service
public class MongoService {

    @Autowired
    private MongoTemplate mongoTemplate;

    public Document simpleQuery() {

        // 1st
        mongoTemplate.aggregate(Arrays.asList(
                sort(Sorts.ascending("hire_date")),
                limit(10)
        ));

        // 2nd
        mongoTemplate.findAll(Employee.class).sort(new BasicDBObject("hire_date", 1));

        // 3rd
        mongoTemplate.findAll(Employee.class).sort((o1, o2) -> o1.getHire_date() > o2.getHire_date());

        // and more...
    }
}

La solución podría ser bastante simple, supongo, al igual que la consulta en sí, pero estos son mis primeros pasos en ese tipo de terreno. Gracias de antemano por cualquier ayuda en este caso.

Respuestas

1 varman Aug 17 2020 at 00:22

Prueba esto,

Aggregation aggregation = Aggregation.newAggregation(
    sort(Sort.Direction.ASC, "hire_date"),
    limit(10)
).withOptions(AggregationOptions.builder().allowDiskUse(Boolean.TRUE).build());

mongoTemplate.aggregate(aggregation, mongoTemplate.getCollectionName(Employee.class), Object.class).getMappedResults();
Gibbs Aug 17 2020 at 00:23

Puede hacer lo siguiente.

  1. Necesitas una parte de consulta
//As you need to match all
Query query = new Query()
  1. Necesita agregar la opción de clasificación
//You need to use Sort class with sorting order, field name to be used for sorting
query.with(new Sort(Sort.Direction.ASC, "hire_date"));
  1. Necesitas agregar la opción de paginación
final Pageable pageableRequest = PageRequest.of(0, 10);
query.with(pageableRequest);
  1. Necesitas agregar un modelo
mongoTemplate(query, Employee.class)

Ejemplo de referencia

Otra respuesta útil