sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoRepository findByCreatedAtBetween returnerer ikke nøjagtige resultater

Opdeler det, forespørgslen med søgeordet Between udføres mod MongoDB-databasen med det logiske resultat {"createdAt" : {"$gt" : d1, "$lt" : d2}} så der er en chance for, at du ikke får de dokumenter, der har createdAt dato inklusive inden for det givne datointerval, dvs. d1 < createdAt < d2 da det givne datointerval ikke opfylder kriterierne. Til reference er disse nogle af fortolkningerne på forespørgselsmetoder :

Understøttede søgeord til forespørgselsmetoder

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

Som en løsning kan du bruge @Query anmærkning. Jeg har ikke testet dette, men du vil måske prøve følgende eksempel på implementering af brugerdefinerede forespørgsler:

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

Hvis ovenstående ikke virker for dig, skal du oprette en brugerdefineret grænseflade og din implementeringsklasse for at udføre den tilpassede forespørgsel. Opret f.eks. en grænseflade med et navn, der tilføjer Custom :

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

Rediger UserRepository og tilføj UserRepositoryCustom grænseflade, der skal udvides:

@Repository
public interface UserRepository extends UserRepositoryCustom, MongoRepository {

}

Opret din implementeringsklasse for at implementere metoderne defineret i UserRepositoryCustom grænseflade.

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



  1. Mongodb rekursiv forespørgsel

  2. Indlejring af skemaer giver fejl

  3. Mongodb præstationsforskel mellem Hash og Stigende indekser (Enhver grund til ikke at bruge hash i et ikke-ordnet felt?)

  4. mongodb kunne ikke oprette forbindelse til serveren