Ich versuche, Datumsfelder in Mongo zu aktualisieren, die ein ISODate-Format erfordern. In Mongo, sieht es wie folgt aus:Verwenden von Joda-Time, um korrekte ISODate für Mongo zu erstellen Einfügen
"crDt" : ISODate("2013-08-19T17:21:57.549Z")
Der Java-Framework I hat mich mit Strings als meine Testparameter beschränkt verwenden, so versuche ich, diese Zeichenfolge mit einem DateTimeFormatter
zu verwenden, um es in die richtigen ISODateTimeFormat
zu bekommen und dann mongo. Ich kann nicht einfach eine Saite übergeben, die aussieht wie das, was ich oben habe. Der Versuch, dies zu tun, zerschlägt das Feld in Mongo. Die entsprechenden Bits von Joda-Time Code Ich verwende wie folgt aussehen:
//I can't get this right.
String crDt = "2013-01-19T15:28:58.851Z";
DateTimeFormatter parser = ISODateTimeFormat.dateHourMinuteSecondMillis();
parser.parseDateTime(crDt);
// this method updates the record in mongo. This method totally works, so no
// point in pasting it here, I just can't get the parser object correct to be
// in the correct format once inserted, it needs to be the correct ISODate form.
mongo.setCrDt(recordId, parser);
Und wenn der Code ausgeführt wird bekomme ich Fehler wie diese aus der .parseDateTime Methode:
java.lang.IllegalArgumentException: Invalid format: "2013-01-19T15:28:58.851Z" is malformed at "Z"
at org.joda.time.format.DateTimeFormatter.parseDateTime(DateTimeFormatter.java:866)
ich die Zeichenfolge sagen kann, ich bin Geben ist nicht korrekt, um Dinge geparst zu bekommen. Ich habe versucht, die Z
zu verlassen, ich habe andere Kombinationen ausprobiert, aber jedes Mal sagt es, dass es falsch ist. Also im Grunde, was muss meine Startstrange sein, damit die .parseDateTime
funktioniert und mir ein Objekt gibt, das richtig aussieht?
EDIT:
aktualisiert die folgenden Vorschläge zu versuchen. Das Problem, mit dem ich jetzt konfrontiert bin, ist eine IllegalArgumentException, die Klasse org.joda.time.DateTime kann nicht serialisiert werden. So scheint es, dass joda Zeitobjekte in einem No-Go bleiben? Ich schaute mir auch den anderen Vorschlag an und untersuchte Mapper-Frameworks wie Spring Data. Es sieht so aus, als müsste noch viel mehr dahintersteckt. Gibt es wirklich keine einfache Möglichkeit, dies in Mongo zu bestehen?
EDIT2:
OK, ich glaube, ich es jetzt habe. Ich habe vielleicht nicht alle Mechaniken im Spiel, aber BasicDBObject s wird nicht nett mit DateTime spielen. Date-Objekte scheinen der einzige Weg zu sein, zumindest in der Implementierung, mit der ich es zu tun habe. Ich habe folgendes:
DateTimeFormatter parser = ISODateTimeFormat.dateTime();
DateTime result;
Date newResult;
result = parser.parseDateTime(crDt);
newResult = result.toDate();
ich dann in newResult für die BasicDBObject weitergegeben aktualisieren Sie die Aufzeichnung in Mongo. Es funktioniert einwandfrei und der Datensatz wird korrekt aktualisiert.
Siehe auch: http://stackoverflow.com/a/17892816/634824 –
ich jetzt eine Illegal beim Versuch der Serialisierung DateTime-Objekt Ähnlich und basierend auf diesem anderen Stackoverflow-Link klingt es so, als müsste ich etwas wie Spring für MongoDB verwenden. Ich bin mir nicht sicher, wo ich anfangen soll, ich muss lediglich einige Felder in Mongo aktualisieren. – Benny
Eine Menge davon hängt davon ab, wie genau Sie das Objekt beibehalten, aber Sie haben nicht die Interna (oder relevanten Teile) der 'setCrDt' Methode gezeigt, daher ist es schwierig zu antworten. Es kann so einfach sein, '.toDate()' auf dem Ergebnis aufzurufen, um ein Java-'Datum' zu erhalten, wenn Ihre Implementierung das versteht. Oder es könnte viel komplexer sein. Schwer zu sagen ohne mehr Details. –