在mongodb-java-driver中编写嵌入式文档的编解码器

时间:2017-02-08 13:13:31

标签: java mongodb bson mongo-java-driver

我在我的应用程序中使用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类创建了Codec -

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中添加了所有Codec。

感谢任何帮助。

1 个答案:

答案 0 :(得分: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;
}