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.

La ordenación de MongoTemplate no está funcionando para LocalDateTime.

Tengo una aplicación SpringBoot con Java 16 + GraphQL + Mongo. Estoy tratando de encontrar todos los registros por ciertas propiedades, que pueden ser NULL. También estoy tratando de implementar la paginación y el ordenamiento, que mientras usaba Mongo/JPA funcionaban perfectamente. Luego tuve que volver atrás y pasar a MongoTemplate para crear un criterio personalizado basado en las propiedades pobladas pasadas. Ahora nada funciona correctamente.

Mi Documento

@Data
@Document(collection = “user”)
@AllArgsConstructor(access = AccessLevel.PUBLIC)
@NoArgsConstructor
@Builder
public class UserDocument {

@Id
private String id;

private String name;
private String email;
private LocaleDateTime createdAt;

}

Mi Repositorio

@Repository
public interface UserRepository {

Page<UserDocument> findUsersByProperties(String name, String email, Pageable page);

}

La clase donde implemento mi Repo

@Repository
public class UserCustom implements UserRepository {

    @Autowired
    MongoTemplate mongoTemplate;

    public Page<UserDocument> findUsersByProperties(String name, String email, Pageable page) {
        final Query query = new Query().with(page);
        final List<Criteria> criteria = new ArrayList<>();

        if (name != null && !name.isEmpty()) {
            criteria.add(Criteria.where("name").is(name));
        }
        if (email != null && !email.isEmpty()) {
            criteria.add(Criteria.where("email").is(email));
        }


        List<UserDocument> users = mongoTemplate.find(query, UserDocument.class);

        return PageableExecutionUtils.getPage(users, page,
                () -> (long)users.size());
    }

}

El código donde llamo a este método y establezco Pageable

Pageable pageable = PageRequest.of(skip == 0 ? skip : skip/first, first).withSort(Sort.by(Sort.Direction.DESC,”createdAt”));
Page result = userRepository.findUsersByProperties(name, email, pageable);
List contentsResult = result.getContent();

Lo que sucede es que
1) la Ordenación no está ordenando: en la segunda página, devuelve muchos registros de la primera página. ¿Es un problema con LocalDateTime? Lo busqué y realmente no debería ser así. Intenté hacer

query.with(Sort.by(Sort.Direction.DESC,”createdAt”));

pero con el mismo resultado.

2) la paginación no está completa, siempre dice que la Page devuelta es la primera y la última, hasNext() y hasPrevious() siempre devuelven false pero en la base de datos tengo miles de entradas que coinciden con el criterio.
3) ¿existe alguna posibilidad de tener un Slice como tipo de retorno con MongoTemplate? Sin tener que convertir de List -> Page -> Slice

Cuando depuro, el objeto de consulta tiene atributos de skip, first y sort correctamente establecidos, pero luego el resultado (al menos del ordenamiento) es incorrecto. Aún así, cuando le digo que salte 40 y tome los primeros 80, esta lógica parece ser correcta.

Realmente no sé qué me falta o si es una especie de limitación con MongoTemplate (que es nuevo para mí). ¡Gracias de antemano por cualquier consejo o idea!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que estás teniendo algunos problemas con la ordenación y paginación al usar MongoTemplate. Es posible que el problema esté relacionado con el campo LocalDateTime, como has mencionado. También es posible que el problema esté relacionado con la forma en que estás construyendo la consulta.

    Para ayudar a solucionar el problema, sería útil ver el código para la construcción de la consulta y el código para la ordenación y paginación. Además, sería útil ver el resultado de la consulta cuando se ejecuta en la shell de Mongo. Esto ayudará a determinar si el problema está relacionado con la construcción de la consulta o la lógica de ordenación/paginación.

    También es posible que el problema esté relacionado con la forma en que MongoTemplate maneja la ordenación y paginación. Si este es el caso, puede que necesites buscar otras opciones para la ordenación y la paginación, como usar el marco de agregación de MongoDB.

Comments are closed.