2017-01-25 2 views
0

Ich habe Probleme bei der Suche ISODate Feld in Mongodb mit Java. Ich möchte genau passendes Datum finden.MongoDB ISODate Feldsuche mit Java

Hier ist, wie ich erste Sammlung abfragen und ISODate Feld "Timestamp" erhalten. Sobald ich dieses Datum habe, möchte ich eine andere Sammlung mit dem gleichen "Timestamp" -Wert suchen.

FindIterable<Document> docList = thermalComfortCollection.find(); 
    for(Document doc: docList) { 

     String ts = doc.get("Timestamp").toString(); 
     System.out.println(ts); 

...

Ich bin isodate Formatierung, da es mir Datum in einem anderen Format zurückgibt, die ich suchen möchten. Deshalb bin ich Umwandlung in dieses Muster „yyyy-MM-dd HH: mm: ss“

 final DateTimeFormatter inputFormat = 
       DateTimeFormatter.ofPattern("EEE MMM dd HH:mm:ss zzz yyyy"); 

     // The parsed date 
     final ZonedDateTime parsed = ZonedDateTime.parse(ts, inputFormat); 

     // The output format 
     final DateTimeFormatter outputFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); 
     String date = outputFormat.format(parsed); 

konnte ich nicht finden, wie für isodate Typ genaue Übereinstimmung Erklärung zu schreiben, so dass ich setzen beide gte und lte Bedingungen, um eine genaue Übereinstimmung zu erhalten ..!

 BasicDBObject query = new BasicDBObject("Timestamp", // 
          new BasicDBObject("$gte", date).append("$lte", date)); 
       System.out.println(query); 

Und die Abfrage funktioniert nicht. Könnten Sie mir einen Kommentar geben, welcher Teil meines Codes falsch ist?

Antwort

0

Da MongoDB alle Daten in UTC mit der Zeitzone speichert, müssen Sie eine Date Instanz anfordern, deren Zeitzone als UTC festgelegt ist.

Lassen Sie uns Tag dieses Dokuments werden in MongoDB ist

{ "_id" : ObjectId("58886fa477717752e6eff16b"), "dd" : ISODate("2017-01-25T09:28:04.041Z") } 

Um es aus Java abfragen, werde ich tun:

String dateStr = "2017-01-25 09:28:04.041 UTC"; 
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS ZZZ").parse(dateStr); 
BasicDBObject filter = new BasicDBObject("dd", date); 
coll.find(filter); 
+0

Thank you! Ich habe ein Problem in meinem Code gefunden, weil ich Filter mit Datum nicht richtig gesetzt habe. – ejshin1

2

Sie vergleichen die Daten nicht ihre String-Formate.

Zum Beispiel, um auf unter Zeitstempel zu vergleichen.

{ "timestamp" : ISODate("2017-01-25T09:28:04.041Z") } 

Code:

Instant instant = Instant.parse("2017-01-25T09:28:04.041Z"); //Pass your date. 

Date timestamp = Date.from(instant); 

Abfrage:

Document query = Filters.eq("timestamp", timestamp); 
+0

Wenn ich diesen Code verwende, dann wird ein Fehler ausgegeben: _java.time.format.DateTimeParseException: Text 'Wed Dez 21 05:45:00 PST 2016' konnte nicht am Index analysiert werden 0_ – ejshin1

+0

Nehmen Sie das Datum als String-Eingabe ? Ihr Datum hat Zeitzone. Parse to 'ZonedDateTime - Instant - Datum' – Veeram

+0

Ich habe ursprünglich Datum als Zeichenfolge eingefügt. Es sollte Datumsstruktur sein, hab es, danke! – ejshin1

Verwandte Themen