试着用ZonedDateTimeMongoDB.我能在MongoDB中存ZonedDateTime,但当我看记录时,里面有太多不必要的东西:

> "timestamp" : {
>             "dateTime" : ISODate("2016-12-13T13:45:53.991Z"),
>             "offset" : {
>                 "_id" : "-05:00",
>                 "totalSeconds" : -18000
>             },
>             "zone" : {
>                 "_class" : "java.time.ZoneRegion",
>                 "_id" : "America/New_York",
>                 "rules" : {
>                     "standardTransitions" : [ 
>                         NumberLong(-2717650800)
>                     ],
>                     "standardOffsets" : [ 
>                         {
>                             "_id" : "-04:56:02",
>                             "totalSeconds" : -17762
>                         }, 
>                         {
>                             "_id" : "-05:00",
>                             "totalSeconds" : -18000
>                         }
>                     ],
>                     "savingsInstantTransitions" : [ 
>                         NumberLong(-2717650800), 
>                         NumberLong(-1633280400), 
>                         NumberLong(-1615140000), 
>                         NumberLong(-1601830800), 
>                         NumberLong(-1583690400), 
>                         NumberLong(-1570381200),
> and so on....

此外,当我试图检索同一日期时,它会给我以下信息:

> org.springframework.data.mapping.model.MappingException: No property
> null found on entity class java.time.ZonedDateTime to bind constructor
> parameter to!

我和LocalDateTime人一起工作时没有这个问题.

UPDATE:

public class ZonedDateTimeToLocalDateTimeConverter implements Converter<ZonedDateTime, LocalDateTime> {
    @Override
    public LocalDateTime convert(ZonedDateTime source) {
        return source == null ? null : LocalDateTime.ofInstant(source.toInstant(), ZoneId
                .systemDefault());
    }
}

public class LocalDateTimeToZonedDateTimeConverter implements Converter<LocalDateTime,
        ZonedDateTime> {
    @Override
    public ZonedDateTime convert(LocalDateTime source) {
        return source == null ? null : ZonedDateTime.of(source, ZoneId.systemDefault());
    }
}

登记如下:

@Bean
public CustomConversions customConversions(){
        List<Converter<?,?>> converters = new ArrayList<Converter<?,?>>();
        converters.add(new ZonedDateTimeToLocalDateTimeConverter());
        converters.add(new LocalDateTimeToZonedDateTimeConverter());
        return new CustomConversions(converters);
    }

@Bean
public MongoTemplate getMongoTemplate() throws UnknownHostException {
        MappingMongoConverter converter = new MappingMongoConverter(
                new DefaultDbRefResolver(getMongoDbFactory()), new MongoMappingContext());
        converter.setCustomConversions(customConversions());
        converter.afterPropertiesSet();
        return new MongoTemplate(getMongoDbFactory(), converter);
    }

推荐答案

看起来Spring支持除ZonedDateTime converter之外的所有java时间转换器.你可以按如下方式注册.

@Bean
public CustomConversions customConversions(){
    List<Converter<?,?>> converters = new ArrayList<>();
    converters.add(new DateToZonedDateTimeConverter());
    converters.add(new ZonedDateTimeToDateConverter());
    return new CustomConversions(converters);
}

@Bean
public MongoTemplate getMongoTemplate() throws UnknownHostException {
    MappingMongoConverter converter = new MappingMongoConverter(
            new DefaultDbRefResolver(getMongoDbFactory()), new MongoMappingContext());
    converter.setCustomConversions(customConversions());
    converter.afterPropertiesSet();
    return new MongoTemplate(getMongoDbFactory(), converter);
}
    
class DateToZonedDateTimeConverter implements Converter<Date, ZonedDateTime> {
    
     @Override
     public ZonedDateTime convert(Date source) {
              return source == null ? null : ofInstant(source.toInstant(), systemDefault());
         }
     }
    
class ZonedDateTimeToDateConverter implements Converter<ZonedDateTime, Date> {
    
    @Override
    public Date convert(ZonedDateTime source) {
             return source == null ? null : Date.from(source.toInstant());
       }
   }

另一种替代解决方案是只使用ZoneDateTime并将其更改为date,同时将其持久化到MongoDB中.在抓取时,您可以轻松地将其从日期更改回分区日期时间.

下面是帮助转换的相关方法.

ZoneId zoneID = ZoneId.of("America/Chicago");

从ZoneDateTime到java util date.

Instant instant = Instant.now();
ZonedDateTime zonedDateTime = instant.atZone(zoneId);
Date date = Date.from(zdt.toInstant());

从日期到分区日期时间

Instant instant = date.toInstant();
ZonedDateTime zonedDateTime = instant.atZone(zoneId);

另一种 Select 是实现自定义编解码器,以帮助进行转换.我在Mongo文档中过滤YearMonth时为YearMonth创建了一个.如果读者想要为分区日期时间创建自定义编解码器,我将把它作为练习留给他们.

您可以使用下面的库来实现基于编解码器的方法.

https://github.com/ylemoigne/mongo-jackson-codec

Mongodb相关问答推荐

MongoDB.ArrayFilters出错:在路径中找不到标识符';elem';的数组筛选器

在mongdob中按子文档筛选不起作用

如何使用内部数组中的值更新文档

Mongoose 查询以获取内部数组和该内部数组中的特定元素

我可以在 MongoDB 中将字段值设置为对象键吗?

Golang:如何判断 collection.Find 是否没有找到任何文件?

@DynamicPropertySource 未被调用(Kotlin、Spring Boot 和 TestContainers)

程序可以运行,但我不断收到发送到客户端后无法设置标题,我应该忽略它吗?

如何使用 Golang 库获取 MongoDB 版本?

mongodb 中的 --bindip 配置选项有什么作用?

mongodb 模式设计命名约定

Node.js 和 MongoDB,重用 DB 对象

mongodb中类型不相等的查询

在 MongoDB 中按条件分组

java.lang.IncompatibleClassChangeError:Implementing class Mongo

使用 MongoDB 的 map/reduce 来分组两个字段

为什么我新创建的 mongodb 本地数据库增长到 24GB?

如何在 MongoDB 中删除此弃用警告,为什么会这样?

120 个 mongodb 集合与单个集合 - 哪个更有效?

mongoose中的 Date.now() 和 Date.now 有什么区别?