2016-08-28 5 views
1

Ich habe den Spring.io Leitfaden für den Zugriff auf MongoDB Daten mit Rest (https://spring.io/guides/gs/accessing-mongodb-data-rest/) gefolgt und kann Dokumente in Mongo speichern.Spring Boot und MongoDB - wie man das Datum speichert

Wenn ich versuche, dem POJO ein Datumsfeld hinzuzufügen und das Datum als new Date()-Objekt festzulegen, speichert es den Wert einfach als null, wenn es in Mongo gespeichert wird.

Ich habe eine sehr einfache @RestController erstellt, die gut funktioniert (übergibt die Anfrage Körper, und speichert es mit meiner MongoRepository Klasse), Speichern von Dokumenten über die Rest-Konsole. Ich habe versucht, ein neues Datum hier zu erstellen und es vor dem Speichern auf Mongo zu setzen, aber das gibt mir so etwas wie "createdDate": 1472394366324.

Ich kann Daten als Zeichenfolge in Mongo speichern, aber was ich will, ist in der Lage, Daten im Datumsformat zu speichern, so dass ich sie mit einer grundlegenden 'Datum zwischen' Abfrage abfragen kann (so etwas wie das genaue format spielt keine große Rolle - "date" : ISODate("2014-02-10T10:50:42.389Z") Ich kann die Abfragen schreiben, um Werte über Parameter zu erhalten, aber um die "Datum zwischen" -Abfrage funktioniert zu bekommen, muss ich in der Lage sein, Datumswerte in Mongo zu speichern.

Was ist das einfachste? Weg dies zu tun

Edit:?

Pojo Klasse -

import org.springframework.data.annotation.Id; 
import org.springframework.data.mongodb.core.mapping.Document; 
import org.springframework.format.annotation.DateTimeFormat; 

import java.util.Date; 

@Document(collection = "Musicians") 
public class Musician { 

@Id 
private String id; 

private String firstName; 
private String lastName; 

@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) 
private Date createdDate = new Date(); 

public Musician() {} 

public Musician(String firstName, String lastName) { 
    this.firstName = firstName; 
    this.lastName = lastName; 
    //createdDate = new Date(); 
} 

public String getFirstName() { 
    return firstName; 
} 

public void setFirstName(String firstName) { 
    this.firstName = firstName; 
} 

public String getId() { 
    return id; 
} 

public void setId(String id) { 
    this.id = id; 
} 

public String getLastName() { 
    return lastName; 
} 

public void setLastName(String lastName) { 
    this.lastName = lastName; 
} 

public Date getCreatedDate() { 
    return createdDate; 
} 

public void setCreatedDate(Date createdDate) { 
    this.createdDate = createdDate; 
} 
} 

Die RestController Klasse -

@RestController 
@RequestMapping(value = "/musicians") 
public class MusicianController { 

@Autowired 
MusicianRepository musicianRepository; 

@Autowired 
MongoTemplate mongoTemplate; 

@RequestMapping(method = RequestMethod.POST, value = "") 
public ResponseEntity<HttpStatus> createMusician(@RequestBody Musician musician) { 
    Musician musicianIn = musician; 

    musicianRepository.save(musicianIn); 

    return new ResponseEntity(HttpStatus.ACCEPTED); 
} 

@RequestMapping(method = RequestMethod.GET, value = "") 
public ResponseEntity<List<Musician>> getMusicians() { 
    List<Musician> musicians = musicianRepository.findAll(); 

    return new ResponseEntity<List<Musician>>(musicians, HttpStatus.OK); 
} 
} 
+0

Sie können versuchen, die Annotation '@ CreatedDate' zum Attribut Ihres POJO hinzuzufügen, zum Beispiel: class MyObject {@CreatedDate Date date; } – ypriverol

+0

das scheint nichts zu ändern. Ich habe die Annotation hinzugefügt, und wenn ich meinem createdDate-Feld ein neues Date() -Zeichen gebe, ist es in mongo null, und wenn ich den Setzer im Rest-Endpunkt vor dem Speichern nach Mongo anrufe, gibt er mir eine Nummer wie die obige. Soll ich etwas anderes machen, damit es funktioniert? Warum erstellt das Festlegen eines Datums im Pojo-Konstruktor einen Nullwert? – spicybanjo

Antwort

0

Ich habe versucht, dies in meinem lokalen mongodb und es funktioniert.

Können Sie das versuchen.

package com.mongo.examples; 

import java.util.ArrayList; 
import java.util.Date; 
import java.util.List; 

import org.bson.BsonDocument; 
import org.bson.Document; 
import org.bson.conversions.Bson; 

import com.mongodb.MongoClient; 
import com.mongodb.client.MongoCollection; 
import com.mongodb.client.MongoCursor; 
import com.mongodb.client.MongoDatabase; 

public class MongoDateTest { 

    public static void main(String args[]){ 

     MongoClient mongoClient = new MongoClient("localhost",27017); 
     MongoDatabase database = mongoClient.getDatabase("testdates"); 

     MongoCollection<Document> collection = database.getCollection("dts"); 
     collection.drop(); 
     List<Document> insertList = new ArrayList<Document>(); 
     Date date = new Date(); 
     Document document = new Document(). 
       append("_id", 20).append("date",date); 
     insertList.add(document); 
     collection.insertMany(insertList); 
     System.out.println(collection.count()); 
     MongoCursor<Document> doc = collection.find(new Document("date", date)).iterator(); 
     System.out.println(doc.next().getDate("date")); 
    } 
} 

Können Sie das versuchen?

+0

Ich denke, dies funktioniert als eine grundlegende Java-Mongo-Implementierung, aber gibt es eine Möglichkeit, es als Teil des POJO zu tun? von dem, was ich sagen kann, ich soll meine Endpunkte schreiben, um die Parameter aufzunehmen, die wir vom Anforderungshauptteil (in JSON) einstellen möchten, das in der Form des Gegenstandes ist, den wir abspeichern möchten und direkt zu meinen POJO.Dann kann ich MyPojoClass myPojo = whateverOurRequestBodyIsCalled ausführen und dann myMongoRepositoryClass.save (myPojo) aufrufen und einen HttpStatus.ACCEPTED zurückgeben. – spicybanjo

+0

Wenn ich es so mache, wie Sie es oben haben, muss ich alle POJO-Felder zu einem Dokument neu zuordnen und speichern, oder kann ich es bearbeiten und das Datum hinzufügen? Wenn das möglich ist, sollte ich das tun? Entschuldigung, wenn das dumme Fragen sind. – spicybanjo

+0

versuchen Sie dies, in Ihrem pojo, wo Sie das Datumsfeld definiert haben, fügen Sie diese Anmerkung über dem Datumsfeld hinzu. etwas wie ... @ DateTimeFormat (iso = ISO.DATE_TIME) \t private Datum createdDate; \t // Getter und Setter-Methoden .. jetzt rufen Sie Ihre Pojo, indem Sie das Datum als java.util.date und Spring-Daten würde darauf achten, diese java.util.date in ISO-Datum zu konvertieren, wenn Sie speichern. HTH .. – user641887

0

Die am häufigsten verwendete Methode zur Verwendung von erstellten/geänderten Datumsangaben ist die Annotation @ CreatedDate/@ ModifiedDate. Um es zu aktivieren, müssen Sie @EnableAuditing Annotation irgendwo neben @Configuration (oder in der Hauptanwendungsdatei) verwenden. Wenn Sie weniger Anmerkungen bevorzugen, können Sie einfach die java8 LocalDateTime-Klasse verwenden.