首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Mongo文档中过滤YearMonth

从Mongo文档中过滤YearMonth
EN

Stack Overflow用户
提问于 2016-11-09 22:21:05
回答 1查看 530关注 0票数 1

在我的MongoDB文档中,json看起来如下所示

代码语言:javascript
复制
{ "_id" : ObjectId("582258c899f8b36081979d1b"), "customer" : "company-name", "start" : { "year" : 2016, "month" : 11 }, "end" : { "year" : 2016, "month" : 11 }

现在,我希望通过与我的java代码中的YearMonth变量进行比较,筛选出“开始”字段,所以我这样做。

代码语言:javascript
复制
public ContractDTO findContractFor(String customer, YearMonth period) {
    BasicDBObject query = new BasicDBObject();
    query.put("start", new BasicDBObject("$eq", period));
    MongoCollection<Document> collection = database.getCollection("contract");
    FindIterable<Document> documents = collection.find(query);
    Document first = documents.first();

在执行上面的最后一行时,我得到以下异常

代码语言:javascript
复制
org.bson.codecs.configuration.CodecConfigurationException: Can't find a codec for class java.time.YearMonth.
    at org.bson.codecs.configuration.CodecCache.getOrThrow(CodecCache.java:46)
    at org.bson.codecs.configuration.ProvidersCodecRegistry.get(ProvidersCodecRegistry.java:63)
    at org.bson.codecs.configuration.ChildCodecRegistry.get(ChildCodecRegistry.java:51)
    at com.mongodb.DBObjectCodec.writeValue(DBObjectCodec.java:210)
    at com.mongodb.DBObjectCodec.encodeMap(DBObjectCodec.java:220)
    at com.mongodb.DBObjectCodec.writeValue(DBObjectCodec.java:196)
    at com.mongodb.DBObjectCodec.encode(DBObjectCodec.java:128)
    at com.mongodb.DBObjectCodec.encode(DBObjectCodec.java:61)
    at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:63)
    at org.bson.codecs.BsonDocumentWrapperCodec.encode(BsonDocumentWrapperCodec.java:29)
    at org.bson.codecs.EncoderContext.encodeWithChildContext(EncoderContext.java:91)
    at org.bson.codecs.BsonDocumentCodec.writeValue(BsonDocumentCodec.java:133)
    at org.bson.codecs.BsonDocumentCodec.encode(BsonDocumentCodec.java:112)
    at org.bson.codecs.BsonDocumentCodec.encode(BsonDocumentCodec.java:40)
    at com.mongodb.connection.RequestMessage.addDocument(RequestMessage.java:253)
    at com.mongodb.connection.RequestMessage.addDocument(RequestMessage.java:205)
    at com.mongodb.connection.CommandMessage.encodeMessageBodyWithMetadata(CommandMessage.java:75)
    at com.mongodb.connection.RequestMessage.encodeWithMetadata(RequestMessage.java:160)
    at com.mongodb.connection.CommandProtocol.sendMessage(CommandProtocol.java:192)
    at com.mongodb.connection.CommandProtocol.execute(CommandProtocol.java:111)
    at com.mongodb.connection.DefaultServer$DefaultServerProtocolExecutor.execute(DefaultServer.java:159)
    at com.mongodb.connection.DefaultServerConnection.executeProtocol(DefaultServerConnection.java:286)
    at com.mongodb.connection.DefaultServerConnection.command(DefaultServerConnection.java:173)
    at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:215)
    at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:206)
    at com.mongodb.operation.CommandOperationHelper.executeWrappedCommandProtocol(CommandOperationHelper.java:112)
    at com.mongodb.operation.FindOperation$1.call(FindOperation.java:487)
    at com.mongodb.operation.FindOperation$1.call(FindOperation.java:482)
    at com.mongodb.operation.OperationHelper.withConnectionSource(OperationHelper.java:239)
    at com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:212)
    at com.mongodb.operation.FindOperation.execute(FindOperation.java:482)
    at com.mongodb.operation.FindOperation.execute(FindOperation.java:79)
    at com.mongodb.Mongo.execute(Mongo.java:772)
    at com.mongodb.Mongo$2.execute(Mongo.java:759)
    at com.mongodb.FindIterableImpl$FindOperationIterable.first(FindIterableImpl.java:207)
    at com.mongodb.FindIterableImpl.first(FindIterableImpl.java:148)

我看了看医生就搞不明白如何让这件事起作用。如果能在某个方向得到提示,我会非常感激的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-10 02:56:45

您需要为年度月份创建自定义编解码器,因为这不是标准的Bson类型。这包括两个步骤。根据你的需要进行调整。

创建编码器

代码语言:javascript
复制
public class YearMonthCodec implements Codec<YearMonth> {

    public void encode(BsonWriter writer, YearMonth value, EncoderContext encoderContext) {

        writer.writeStartDocument();

        writer.writeName("year");
        writer.writeInt32(value.getYear());
        writer.writeName("month");
        writer.writeInt32(value.getMonth().getValue());

        writer.writeEndDocument();

    }

    public Class<YearMonth> getEncoderClass() {
        return YearMonth.class;
    }

    public YearMonth decode(BsonReader reader, DecoderContext decoderContext) {

        reader.readStartDocument();

        int year = reader.readInt32("year");
        int month = reader.readInt32("month");

        reader.readEndDocument();

        return YearMonth.of(year, month);

    }

}   

向Mongo客户端注册编解码器

代码语言:javascript
复制
CodecRegistry codecRegistry = CodecRegistries.fromRegistries(CodecRegistries.fromCodecs(new YearMonthCodec()),
        MongoClient.getDefaultCodecRegistry());
MongoClientOptions options = MongoClientOptions.builder().codecRegistry(codecRegistry).build();
MongoClient mongoClient = new MongoClient(new ServerAddress(), options);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40516987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档