sql >> データベース >  >> NoSQL >> MongoDB

MongoRepositoryfindByCreatedAtBetweenが正確な結果を返さない

    内訳を見ると、キーワードBetweenを使用したクエリ MongoDBデータベースに対して実行され、論理結果は{"createdAt" : {"$gt" : d1, "$lt" : d2}} そのため、createdAtを持つドキュメントを取得できない可能性があります 指定された日付範囲内の日付(d1 < createdAt < d2) 指定された日付範囲が基準を満たしていないためです。参考までに、これらは クエリメソッド

    クエリメソッドでサポートされているキーワード

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

    回避策として、 @Query 注釈。これはテストしていませんが、次のカスタムクエリの実装例を試してみてください。

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

    上記がうまくいかない場合は、カスタムインターフェイスと実装クラスを作成してカスタムクエリを実行します。たとえば、Customを追加する名前のインターフェースを作成します :

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

    UserRepositoryを変更します UserRepositoryCustomを追加します 拡張するインターフェース:

    @Repository
    public interface UserRepository extends UserRepositoryCustom, MongoRepository {
    
    }
    

    UserRepositoryCustomで定義されたメソッドを実装するための実装クラスを作成します インターフェース。

    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とNodeJをバッチ挿入

    2. 複数列のユニークなマングースnodejsの組み合わせ

    3. MongoDBのファセットを使用してパーセンテージを計算するにはどうすればよいですか?

    4. meteor.comでデプロイされたアプリでMongorestore認証が失敗する