【问题标题】:Spring Boot and MongoDB - how to save dateSpring Boot 和 MongoDB - 如何保存日期
【发布时间】:2023-03-15 00:04:02
【问题描述】:

我已按照 Spring.io 指南使用 rest (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);
}
}

【问题讨论】:

  • 你可以尝试在你的POJO的属性中添加@CreatedDate注解,例如:class MyObject{ @CreatedDate Date date; }
  • 这似乎没有任何改变。我已经添加了注释,如果我将 new Date() 分配给我的 createdDate 字段,它在 mongo 中为空,如果我在保存到 mongo 之前调用其余端点中的设置器,它会给我一个类似上面的数字。我应该做其他事情来让它工作吗?为什么在 pojo 构造函数中设置日期会创建一个空值?

标签: spring mongodb spring-boot


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我在本地的 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"));
        }
    }
    

    【讨论】:

    • 我认为这可以作为基本的 java 到 mongo 实现,但是有没有办法将它作为 POJO 的一部分?据我所知,我应该编写我的端点以接收我们想要从请求正文(以 JSON 格式)设置的参数,这些参数将以我们要保存的对象的形式存在,并且应该直接映射到我的POJO。然后我可以做 MyPojoClass myPojo = 不管我们的RequestBodyIsCalled,然后调用 myMongoRepositoryClass.save(myPojo),并返回一个 HttpStatus.ACCEPTED。
    • 如果我按照上面的方式进行操作,我是否必须将所有 POJO 字段重新映射到文档并将其保存下来,或者我可以编辑它并添加日期吗?如果这是可能的,那是我应该做的吗?如果这些是愚蠢的问题,我们深表歉意。
    • 试试这个,在您定义日期字段的 pojo 中,在日期字段上方添加此注释。类似于 ...@DateTimeFormat(iso = ISO.DATE_TIME) private Date createdDate; //getter 和 setter 方法 .. 现在通过将日期设置为 java.util.date 来调用您的 pojo,并且当您保存时,spring data 将负责将该 java.util.date 转换为 ISO 日期。 HTH..
    • 呃,我好像听不懂。我已经完全按照上面的方法尝试了 @DateTimeFormat 注释。如果我在 POJO 构造函数中设置 createdDate = new Date() ,我仍然会得到空值。如果我在保存之前调用端点中的设置器,我会得到“createdDate”:1472405549532,如果我在我的 POJO 中直接在注释下分配变量时简单地设置 createdDate = new Date(),我会得到相同的结果。我认为这个最终解决方案可能会解决它,但没有。我对此完全感到困惑。
    • 你确定你导入的是 java.util.date 而不是 java.sql.date 吗?你能分享你的代码吗?
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2022-01-17
      • 2022-07-07
      • 2011-11-23
      相关资源
      最近更新 更多