MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

MongoRepository findByCreatedAtBetween ne renvoie pas de résultats précis

En décomposant, la requête avec le mot-clé Between est exécuté sur la base de données MongoDB avec le résultat logique {"createdAt" : {"$gt" : d1, "$lt" : d2}} il y a donc une chance que vous n'obteniez pas les documents qui ont le createdAt date incluse dans la plage de dates donnée, c'est-à-dire d1 < createdAt < d2 car la plage de dates donnée ne répond pas aux critères. Pour référence, voici quelques-unes des interprétations sur le méthodes de requête :

Mots clés pris en charge pour les méthodes de requête

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}}

Comme solution de contournement, vous pouvez utiliser le @Query annotation. Je n'ai pas testé cela, mais vous pouvez essayer l'exemple d'implémentation de requête personnalisée suivant :

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

Si ce qui précède ne fonctionne pas pour vous, créez une interface personnalisée et votre classe d'implémentation pour exécuter la requête personnalisée. Par exemple, créez une interface avec un nom qui ajoute Custom :

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

Modifier le UserRepository et ajoutez le UserRepositoryCustom interface à étendre :

@Repository
public interface UserRepository extends UserRepositoryCustom, MongoRepository {

}

Créez votre classe d'implémentation pour implémenter les méthodes définies dans UserRepositoryCustom interface.

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));
    }
}