sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoRepository findByCreatedAtBetween no devuelve resultados precisos

Desglosándolo, la consulta con la palabra clave Between se está ejecutando contra la base de datos MongoDB con el resultado lógico {"createdAt" : {"$gt" : d1, "$lt" : d2}} por lo que existe la posibilidad de que no obtenga los documentos que tienen el createdAt fecha inclusive dentro del intervalo de fechas dado, es decir, d1 < createdAt < d2 ya que el rango de fechas dado no cumple con los criterios. Como referencia, estas son algunas de las interpretaciones en métodos de consulta :

Palabras clave admitidas para métodos de consulta

Keyword     Sample                              Logical result
After       findByBirthdateAfter(Date date)     {"birthdate" : {"$gt" : date}}
Before      findByBirthdateBefore(Date date)    {"birthdate" : {"$lt" : date}}
Between     findByAgeBetween(int from, int to)  {"age" : {"$gt" : from, "$lt" : to}}

Como solución alternativa, es posible que desee utilizar @Query anotación. No he probado esto, pero es posible que desee probar el siguiente ejemplo de implementación de consulta personalizada:

public interface UserRepository extends MongoRepository<User, String>  {
    @Query(value = "{ 'createdAt' : {$gte : ?0, $lte: ?1 }}")
    public ArrayList<User> findbyCreatedAtBetween(Date from, Date to);
}

Si lo anterior no funciona para usted, cree una interfaz personalizada y su clase de implementación para ejecutar la consulta personalizada. Por ejemplo, cree una interfaz con un nombre que agregue Custom :

public interface UserRepositoryCustom {
    public List<User> findbyCreatedAtBetween(Date from, Date to); 
}

Modificar el UserRepository y agregue el UserRepositoryCustom interfaz que se ampliará:

@Repository
public interface UserRepository extends UserRepositoryCustom, MongoRepository {

}

Cree su clase de implementación para implementar los métodos definidos en UserRepositoryCustom interfaz.

public class UserRepositoryImpl implements UserRepositoryCustom {

    @Autowired
    MongoTemplate mongoTemplate;

    @Override
    public ArrayList<User> findbyCreatedAtBetween(Date from, Date to) {
        return mongoTemplate.find(
            Query.addCriteria(Criteria.where("createdAt").gte(from).lte(to));
    }
}