Mongo筛选器和日期检查

时间:2019-09-02 12:08:27

标签: java mongodb micronaut

我对使用Java的Mongo还是比较陌生,目前在创建与日期结合使用的过滤器时遇到一些问题。

考虑以下内容,我有一个包含以下字段的实体类:

private String emailMessageKey;
private Integer customerId;
private ZonedDateTime timeScheduled;

我定义了一个存储库,可以进行一些基本的CRUD操作。其中之一围绕基于timeScheduled字段查询其中一些对象而展开。为此,我将创建以下过滤器:

Bson filter = Filters.and(
    Filters.eq("campaignRunId", campaignRunId),
    Filters.lte("timeScheduled", ZonedDateTime.now())
);

我的问题是上述过滤器无法返回正确的结果。我尝试删除日期检查,但我的其他条件正常运行,因此推断出ZonedDateTime检查不正确。

我尝试在线查找解决方案,但未能找到相关内容。为了记录,我正在使用以下编解码器将ZonedDateTime映射到数据库:

public class ZonedDateTimeCodec implements Codec<ZonedDateTime> {

    private static final String DATE_TIME = "dateTime";
    private static final String TIMEZONE = "timeZone";

    @Override
    public ZonedDateTime decode(BsonReader reader, DecoderContext decoderContext) {
        reader.readStartDocument();
        long epochInSeconds = reader.readDateTime(DATE_TIME);
        String zoneId = reader.readString(TIMEZONE);
        reader.readEndDocument();
        return ZonedDateTime.ofInstant(Instant.ofEpochSecond(epochInSeconds / 1_000), ZoneId.of(zoneId));
    }

    @Override
    public void encode(BsonWriter writer, ZonedDateTime value, EncoderContext encoderContext) {
        writer.writeStartDocument();
        writer.writeDateTime(DATE_TIME, value.toInstant().getEpochSecond() * 1_000);
        writer.writeString(TIMEZONE, value.getZone().getId());
        writer.writeEndDocument();
    }

    @Override
    public Class<ZonedDateTime> getEncoderClass() {
        return ZonedDateTime.class;
    }
}

我的问题是,我应该如何使用Filters类提供的各种过滤器执行日期检查?记录下来,我正在使用Micronaut开发。

0 个答案:

没有答案