【问题标题】:Write Codec for embedded documents in mongodb-java-driver在 mongodb-java-driver 中为嵌入文档编写 Codec
【发布时间】:2017-06-26 03:10:39
【问题描述】:

我在我的应用程序中使用 mongo-java-driver 来读取和写入数据到 mongodb。

我有这样的课程 -

public A{
    private String a;
    //Getters & Setters
}

public class B{
    private String b;
    private List<A> a;
    //Getters & Setters
}

public class C{
    private String c;
    private B b;
    //Getters & Setters
}

我已经像这样为 C 类创建了编解码器 -

public class CCodec implements Codec<C> {

    private Codec<Document> documentCodec;

    public CCodec(CodecRegistry registry) {
        documentCodec = registry.get(Document.class);
    }

    @Override
    public void encode(BsonWriter writer, C c, EncoderContext context)     {
        Document document = new Document();
        document.put("c",c.getC());
        document.put("b",c.getB());
        documentCodec.encode(writer, document, context);
    }
}

B 类编解码器 -

public class BCodec implements Codec<B> {

        private Codec<Document> documentCodec;

        public CCodec(CodecRegistry registry) {
            documentCodec = registry.get(Document.class);
        }

        @Override
        public void encode(BsonWriter writer, B b, EncoderContext context)     {
            writer.writeStartDocument();
            writer.writeString("b",b.getB());
            //How to encode A Here
            writer.writeEndDocument();
        }
    }

我不能像在 CCodec 中那样在 BCodec 中进行编码,因为当我说

Document document = new Document();

它创建了一个新文档,但我不想将它嵌入到文档 C 中。

现在的问题是如何在 B 类中对 List 类型的字段 a 进行编码? 请参见 BCodec 类的编码方法。 不用说我已经在 CodecProvider 中添加了所有的编解码器。

感谢任何帮助。

【问题讨论】:

    标签: java mongodb bson mongo-java-driver


    【解决方案1】:

    你可以尝试使用DocumentCodec.encode方法如下-

    @Override
    public void encode(BsonWriter writer, B b, EncoderContext context) {
        org.bson.Document bsonDocument = new org.bson.Document();
        List<A> a = B.getA();
        bsonDocument.put("a", a);
        ...
        documentCodec.encode(writer, bsonDocument, encoderContext);
    }
    

    和你一样decode

    @Override
    public B decode(BsonReader reader, DecoderContext decoderContext) {
        org.bson.Document bsonDocument = documentCodec.decode(reader, decoderContext);
        B b = new B();
        b.setA((List)bsonDocument.getString("a"));
        ...
        return b;
    }
    

    【讨论】:

    • 它和我上面写的有什么不同?
    • @RaviKumar //如何在您的代码中编码 A Here 已得到解答。 如何在 B 类中对 List 类型的字段 a 进行编码? 是我在解码 B 时将编码的 A 转换为 List 的地方。
    猜你喜欢
    • 1970-01-01
    • 2012-08-29
    • 2016-08-13
    • 2018-08-21
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    相关资源
    最近更新 更多