Spring Boot和MongoDB - 如何保存日期

8
我已经按照Spring.io上的指南使用rest访问MongoDB数据(https://spring.io/guides/gs/accessing-mongodb-data-rest/),并能够将文档保存到mongo中。当我尝试在POJO中添加日期字段并将日期设置为 new Date()对象时,保存到mongo时它只会把这个值保存为null。
我创建了一个非常基本的@RestController,它运行良好(通过请求体进行传递,并使用我的MongoRepository类保存下来),可以通过rest控制台保存文档。我尝试在此处创建一个新的日期,并在保存之前将其设置,但是这会给我一些像"createdDate": 1472394366324这样的东西。
我可以将日期保存为字符串到Mongo中,但我想要的是能够以日期格式保存日期,以便可以使用基本的“日期 between”查询查询它们(所以类似这样的内容,确切的格式并不重要- "date": ISODate("2014-02-10T10:50:42.389Z") )。我可以编写用于通过参数获取值的查询,但是要使“日期between”查询工作,我需要能够将日期值存储到Mongo中。
最简单的方法是什么?
编辑:
Pojo class -
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;
}
}

The RestController class -

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

你可以尝试在POJO的属性上添加@CreatedDate注解,例如:class MyObject{ @CreatedDate Date date; } - ypriverol
这似乎没有改变任何东西。我已经添加了注释,如果我将new Date()分配给我的createdDate字段,则在mongo中它为null,如果在保存到mongo之前在rest端点中调用setter,则会给我一个像上面那样的数字。我应该做些什么才能使它正常工作?为什么在pojo构造函数中设置日期会创建一个空值? - spicybanjo
3个回答

3

使用创建/修改日期的最常见方法是通过注释@CreatedDate/@ModifiedDate。为了启用它,您必须在@Configuration旁边或主应用程序文件中的某个位置使用@EnableAuditing注释。

如果您喜欢较少的注释,可以只使用Java8 LocalDateTime类。


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
我认为这是一个基本的Java到Mongo实现,但有没有办法将其作为POJO的一部分来完成?据我所知,我应该编写我的端点以接收我们想要从请求正文(以JSON格式)设置的参数,这将以我们要保存的对象形式呈现,并且应直接映射到我的POJO。然后我可以做MyPojoClass myPojo = whateverOurRequestBodyIsCalled,然后调用myMongoRepositoryClass.save(myPojo),并返回HttpStatus.ACCEPTED。 - spicybanjo
请尝试在您定义日期字段的POJO中,在日期字段上方添加此注释。类似于...@DateTimeFormat(iso = ISO.DATE_TIME) private Date createdDate; //getter和setter方法..现在通过将日期设置为java.util.date来调用您的POJO,Spring数据会负责在保存时将该java.util.date转换为ISO日期。希望对您有所帮助.. - user641887
是的,我已经仔细检查过了。我会编辑我的原始问题,添加POJO和其余的控制器代码。我认为这应该很简单/愚蠢,因为我确定这应该可以工作。 - spicybanjo
在你的控制器中,你可以打印出分配给musicianIn对象的名字、姓氏和日期值吗?请注意,在Musician musicianIn = musician;这行代码之后。 - user641887
现在唯一的问题是,当端点返回JSON对象时,当我访问URL时,它仍然给出“createdDate”:1472407527149。获取端点在代码中,只是一个repository.findAll(),返回音乐家对象列表。我假设它会返回与shell相同的内容? - spicybanjo
显示剩余7条评论

0

为了在Mongo数据库中保存本地日期时间(使用单独的时区属性),我使用了Chamindu在https://chamindu.dev/posts/localdatetime-spring-mongodb/中描述的技术。只需确保扩展AbstractMongoClientConfiguration,而不是他所指示的AbstractMongoConfiguration。 - tlarson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接