2011-07-27 15 views
34

मैंने अपने संग्रह में java.util.Date() के रूप में एक मान संग्रहीत किया है, लेकिन जब मैं दो विशिष्ट तिथियों के बीच मूल्य प्राप्त करने के लिए क्वेरी करता हूं, तो मैं सीमा के बाहर मूल्य प्राप्त करता हूं। यहाँ मेरी कोड है:जावा/मोंगोडीबी तिथि

BasicDBObject object = new BasicDBObject(); 
... 
object.put("dateAdded", new java.util.Date()); 
collection.insert(object); 

डालने के लिए

BasicDBObject query = new BasicDBObject(); 
query.put("dateAdded", new BasicDBObject("$gte", fromDate)); 
query.put("dateAdded", new BasicDBObject("$lte", toDate)); 
collection.find(query).sort(new BasicDBObject("dateAdded", -1)); 

क्वेरी करने के लिए जब मैं Wed Jul 27 16:54:49 EST 2011 और Wed Jul 27 16:54:49 EST 2011 (मूल रूप से fromDate = todate) के बीच क्वेरी, मैं Tue Jul 26 09:43:37 EST 2011 तरह तिथियों के साथ वस्तुओं मिलता है जो होना चाहिए निश्चित रूप से संभव नहीं है। मुझे यहां क्या समझ नहीं आ रहा है?

उत्तर

47

आप जो कर रहे हैं वह केवल {$lte: toDate} के साथ पूछताछ कर रहा है $gte ऑपरेटर कुंजी ओवरराइट में खो रहा है। क्या आप चाहते हैं:

query.put("dateAdded", BasicDBObjectBuilder.start("$gte", fromDate).add("$lte", toDate).get()); 
+0

उत्कृष्ट टिप! तो मूल रूप से हर बार जब मैं अलग-अलग मानदंडों के साथ एक ही क्षेत्र में पूछताछ करना चाहता हूं तो मुझे निर्माता का सही उपयोग करना होगा? जानकार अच्छा लगा! आपको यह कहां से मिला? क्या कोई दस्तावेज है जिसके बारे में मुझे पता नहीं है? (चूंकि मोंगोडब आधिकारिक जावा ट्यूटोरियल काफी खराब है!) – Guillaume

+1

@ गुलिअम बिल्कुल नहीं। आप 'बेसिक डीबीबीजेक्ट' भी बना सकते हैं और पॉप्युलेट कर सकते हैं, बिल्डर सिर्फ सहायक है जो इसे एक एकल संवर्धन के अंदर करने की अनुमति देता है। समस्या यह है कि 'DBObject' (जावा में सभी' मानचित्र 'की तरह) केवल अनन्य कुंजी हो सकती है। और जब आप एक ही कुंजी के साथ नया डालते हैं तो आप पिछले मान को खो देते हैं। इसके अलावा आधिकारिक ट्यूटोरियल में एक ही फ़ील्ड पर एकाधिक ऑपरेटरों का उपयोग करने के उदाहरण हैं: http://www.mongodb.org/display/DOCS/Java+Tutorial#JavaTutorial-GettingASetofDocumentsWithaQuery – pingw33n

+3

आश्चर्यजनक रूप से उस प्रश्न का उत्तर ढूंढना मुश्किल है। –

1

आप वसंत-डाटा MongoDB के MongoTemplate का उपयोग कर रहे हैं, तो आप निम्नलिखित तरीके से एक ही कर सकते हैं: -

public List<Link> getLinksBetweenDate(Date startDate, Date endDate) { 
      Query query = new Query().addCriteria(Criteria.where("updatedOn").gt(startDate).lte(endDate)); 
      return mongoTemplate.find(query, Link.class); 
     } 
3

का उपयोग करते हुए मोंगो ग्राहक 3,0

DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.ENGLISH); 
Bson filter = new Document("$gte", format.parse("2015-05-01T00:00:00Z")).append("$lt", format.parse("2015-05-02T00:00:00Z")); 
long count = db.getCollection("colection").count(new Document("field",filter)); 
+0

लंबी गिनती वापसी क्या करती है? इस चर के भीतर क्या है? आप इस चर से डेटाबेस प्रविष्टियों को कैसे निकालते हैं? – user3388925

2

निम्नलिखित प्रारूपों के साथ विशिष्ट तिथि के साथ खोज दिनांक यह है कि यह भी मोंगो 3.0

SimpleDateFormat simpleDateFormat = new SimpleDateFormat ("yyyy.MM.dd"); 
में काम करता है

पहले अपनी तिथि को अपने विशिष्ट प्रारूप में रूपांतरित करें, आप किसी भी प्रारूप का उपयोग कर सकते हैं और उपरोक्त प्रारूप के साथ अपनी तिथि का विश्लेषण कर सकते हैं और फिर क्वेरी में पास कर सकते हैं।

String date ="2014.01.02"; 
String data1 ="2014.01.10"; 
Date startDate = simpleDateFormat.parse(date); 
Date endDate = simpleDateFormat.parse(date1); 
BasicDBObject query = new BasicDBObject("fieldName", 
    new BasicDBObject("$gte",startDate).append("$lt",endDate)); 

तो आपकी आवश्यकता के आधार पर आप BasicDBobject में तर्क देकर तारीख खोज सकते हैं।

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