2015-11-03 7 views
5

मोंगो में मेरे दस्तावेज़ संरचना इस तरह है:MongoRepository findByCreatedAtBetween सटीक परिणाम नहीं लौटा रहा

db.user.find()

{ 
     "_id" : ObjectId("560fa46930a8e74be720009a"), 
     "createdAt" : ISODate("2015-10-03T09:47:56.333Z"), 
     "message" : "welcome", 
} 
{ 
      "_id" : ObjectId("560fa46930a8e723e720009a"), 
      "createdAt" : ISODate("2015-10-03T09:48:25.048Z"), 
      "message" : "thank you" 
} 

जब मैं अपने मोंगो शैल में नीचे क्वेरी का उपयोग के बीच दस्तावेज़ खोजें

db.user.find({createdAt:{$gte:ISODate("2015-10-03T09:40:25.048Z"),$lte:ISODate("2015-10-03T09:50:56.333Z")}}) 

मैं वसंत के साथ MongoRepository उपयोग कर रहा हूँ मेरी बाकी सेवा में जावा ड्राइवर के साथ काम करने के लिए: दिए गए दो timestamps, मैं सही परिणाम मिलता है।

public interface UserRepository extends MongoRepository<User, String> 
{ 
     ArrayList<User> findbyCreatedAtBetween(Date d1, Date d2); 

} 

जब मैं अपने सेवा में निम्नलिखित कॉल कर फोन, यह किसी भी परिणाम userRepository.findbyCreatedAtBetween(2015-10-03T09:40:25.048Z, 2015-10-03T09:50:29.006Z)

हालांकि यह परिणाम देता है जब मैं पिछले दिन के रूप में d1 दे वापस नहीं करता है: नीचे उपयोगकर्ता भंडार है userRepository.findbyCreatedAtBetween (2015-10-02T09: 40: 25.048Z, 2015-10-03T09: 50: 29.006Z)

इस पर कोई विचार है कि मैं इसे कैसे हल कर सकता हूं? कृपया सहायता कीजिए!

+0

@chridam के रूप में 'बीच के कीवर्ड' में वर्णित खोज मानदंडों में पैरामीटर शामिल नहीं हैं। इसके अलावा आप 'findbyCreatedAtBetween' को 'findByCreatedAtBetween'' –

उत्तर

7

यह विश्लेषण करना, कीवर्ड Between साथ क्वेरी तार्किक परिणाम {"createdAt" : {"$gt" : d1, "$lt" : d2}} साथ MongoDB डेटाबेस के खिलाफ निष्पादित किया जा रहा है, ताकि इस बात की संभावना है कि आप दस्तावेज है कि createdAt तारीख दी गई समय अवधि यानी भीतर समावेशी नहीं मिल रहा है है d1 < createdAt < d2 दी गई तिथि सीमा मानदंडों को पूरा नहीं करती है। संदर्भ के लिए इन query methods पर व्याख्याओं में से कुछ हैं: क्वेरी तरीकों

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

द्वारा प्रतिस्थापित करना चाहते हैं, मैंने आपके द्वारा सुझाए गए पहले विकल्प की कोशिश की थी, लेकिन यह काम नहीं किया। ऐसा लगता है कि मोंगो रेपोस्टोरी शांत है, मोंगो टेम्पलेट के साथ रिपोजिटरी का उपयोग करना इतना बेहतर है। आपका सुझाव देने के लिए धन्यवाद! – sindhunk

+0

@ सिंधहंक वास्तव में, यह काफी सीमित है लेकिन मुझे खुशी है कि आपको एक कामकाज मिला है :) – chridam

संबंधित मुद्दे