Spring Boot和MongoDB - 如何保存日期

时间:2016-08-28 15:21:34

标签: spring mongodb spring-boot

我已经按照Spring.io指南访问了休息(https://spring.io/guides/gs/accessing-mongodb-data-rest/)的MongoDB数据,并且可以将文档保存到mongo中。

当我尝试在POJO中添加日期字段并将日期设置为new Date()对象时,它只会在保存到mongo时将值保存为null。

我已经创建了一个非常基本的@RestController,它正常工作(在请求正文中传递,并使用我的MongoRepository类将其保存下来),通过其余控制台保存文档。我尝试在这里创建一个新日期并在将其保存到Mongo之前进行设置,但这给了我类似"createdDate": 1472394366324的内容。

我可以将日期作为字符串保存到Mongo中,但我想要的是能够以日期格式保存日期,以便我可以查询它们之间的基本日期'查询(所以类似这样的,确切的格式并不重要 - "date" : ISODate("2014-02-10T10:50:42.389Z")。我可以编写查询以通过参数获取值,但是可以在查询工作之间获得日期我需要能够将日期值存储到Mongo中。

实现这一目标的最简单方法是什么?

编辑:

Pojo课程 -

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;
}
}

RestController类 -

@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);
}
}

3 个答案:

答案 0 :(得分:1)

我在当地的mongodb尝试了这个并且它有效。

你能试试吗?

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"));
    }
}

你能试试吗?

答案 1 :(得分:0)

发生这种情况是因为 mongo db 以UTC格式存储日期,这可能是毫秒,你可以查看mongodb https://docs.mongodb.com/manual/reference/method/Date/

您必须将其转换为当地时区日期。

答案 2 :(得分:0)

使用创建/修改日期的最常用方法是注释 @ CreatedDate / @ ModifiedDate 。要启用它,您必须在@Configuration(或主应用程序文件)旁边的某处使用 @EnableAuditing 注释。 如果您更喜欢注释,则可以使用java8 LocalDateTime类。