我对使用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开发。