当前位置: 首页 > 面试题库 >

MongoDB的ZonedDateTime

孟凯泽
2023-03-14
问题内容

尝试使用ZonedDateTimeMongoDB。我可以保存ZonedDateTimeMongoDB但是当我查看记录时,里面有很多不必要的东西:

> "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。第一个问题是我们可以在仅能持续ISODate使用的地方更改某些设置ZonedDateTime吗?第二个问题,是有什么样Jsr310JpaConvertersmongodb

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支持所有Java时间转换器减去分区日期时间转换器。您可以如下注册一个。

@Bean
public CustomConversions customConversions(){
    List<Converter<?,?>> converters = new ArrayList<Converter<?,?>>();
    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());
       }
   }

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

以下是有助于转换的相关方法。

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

从ZonedDateTime到Java使用日期。

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

从日期到ZonedDateTime

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

另一种选择是实现自定义编解码器以帮助进行转换。我已经在Mongo文档的筛选YearMonth中为YearMonth创建了一个。如果读者想为“区域日期时间”创建自定义编解码器,我将把它留给读者练习。

您可以将以下库用于基于编解码器的方法。

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



 类似资料:
  • MongoDB是一个跨平台,面向文档的数据库,提供高性能,高可用性和易扩展性。 MongoDB适用于集合和文档的概念。 有关更多信息,请阅读我们的MongoDB教程 。 在本章中,您将学习如何使用CoffeeScript与MongoDB数据库进行通信。 安装 (Installation) 可以使用MongoDB的Node.js 2.0驱动程序将MongoDB数据库与CoffeeScript集成。

  • 本文向大家介绍MongoDB的索引,包括了MongoDB的索引的使用技巧和注意事项,需要的朋友参考一下 1、简介 它就像是一本书的目录,如果没有它,我们就需要对整个书籍进行查找来获取需要的结果,即所说的全盘扫描; 而有了目录(索引)之后就可以通过它帮我们定位到目标所在的位置,快速的获取我们想要的结果。 2、演示 第一步,向用户集合users中插入100W条数据 LZ的渣渣I3和4G内存总共耗时了4

  • 更新: 案例1:本地机器的mongo上的远程访问是因为我选择的发行版配置为允许远程连接。

  • 问题内容: 我是使用MEAN Stack构建应用程序的新手,我正在尝试构建实时聊天应用程序,这是我的服务器端: 我确定我创建了一个与mongodb聊天的数据库,mongo也正在等待连接。但是当我使用节点server.js运行服务器时,会发生错误: 在这个阶段,我被封锁了几个星期,有人可以帮忙吗? 谢谢。 问题答案: 这是因为您使用的连接字符串格式不正确。 您正在使用它应该是 连接字符串的模式是 供

  • 我有一个Java应用程序,它处理avro消息的Kafka流,并为每条消息对mongoDB集合执行查询。 在正确处理了几十条消息后,应用程序停止运行并抛出“com.mongodb.MongoSocketReadExc0019:过早到达流的结尾”。 这是代码:

  • 问题 你需要与一个 MongoDB 数据库连接的接口。 解决方案 对于 Node.js 安装 如果你的计算机中还没有 MongoDB ,需要安装。 安装本地 MongoDB 模块。 保存记录 mongo = require 'mongodb' server = new mongo.Server "127.0.0.1", 27017, {} client = new mongo.Db 'test