2017-02-08 25 views
1

嵌入文檔我使用蒙戈-Java的應用程序在我的應用程序來讀取和寫入數據的MongoDB。寫碼器用於在MongoDB中的Java驅動程序

我有類這樣的 -

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(); 
     } 
    } 

我不能在BCodec中進行編碼,就像我爲CCodec做的一樣,因爲當我說

Document document = new Document(); 

它創建一個新的文件,但我wan't要把它嵌入在文件C.

現在的問題是怎樣在B級編碼類型列表的領域? 請參閱BCodec類的編碼方法。不用說我已經在CodecProvider中添加了所有的編解碼器。

任何幫助表示讚賞。

回答

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; 
} 
+0

它是如何從我有上面寫的有什麼不同? –

+0

@RaviKumar ** //如何編碼A在這裏**在你的代碼中已被回答。 *我如何編碼B類中List類型的字段?*是在解碼B中將編碼後的A編碼到列表中的地方。 – nullpointer