Java 具有特定文档类的MongoDB getCollection

Java 具有特定文档类的MongoDB getCollection,java,mongodb,mongodb-java,Java,Mongodb,Mongodb Java,我的问题是将MongoDB文档转换为一种类型: getCollectionjavadoc说明: /** * Gets a collection, with a specific default document class. * * @param collectionName the name of the collection to return * @param documentClass the default class to cast an

我的问题是将
MongoDB
文档转换为一种类型:

getCollection
javadoc
说明:

  /**
     * Gets a collection, with a specific default document class.
     *
     * @param collectionName the name of the collection to return
     * @param documentClass  the default class to cast any documents returned from the database into.
     * @param <TDocument>    the type of the class to use instead of {@code Document}.
     * @return the collection
     */
    <TDocument> MongoCollection<TDocument> getCollection(String collectionName, Class<TDocument> documentClass);
编解码器实现提供程序:

package utils;

import org.bson.BsonReader;
import org.bson.BsonWriter;
import org.bson.codecs.Codec;
import org.bson.codecs.DecoderContext;
import org.bson.codecs.EncoderContext;
import org.bson.codecs.configuration.CodecRegistry;

import digester.Account;
import digester.Customer;
import dto.AccountDTO;

// the Codec extends two interfaces: Encoder<T>, Decoder<T>
class MyAccountDTOImpCodec implements Codec<AccountDTO> {

    private CodecRegistry codecRegistry;

    public MyAccountDTOImpCodec(CodecRegistry codecRegistry) {
        this.codecRegistry = codecRegistry;
    }

    public void encode(BsonWriter writer, AccountDTO doc, EncoderContext encoderContext) {
        writer.writeStartDocument();
        writer.writeName("IBAN");
        writer.writeString(doc.getIBAN());
        writer.writeName("customerFirstName");
        writer.writeString(doc.getCustomerFirstName());
        writer.writeName("customerLastName");
        writer.writeString(doc.getCustomerLastName());
        writer.writeEndDocument();
    }

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

    public AccountDTO decode(BsonReader reader, DecoderContext decoderContext) {
        reader.readStartDocument();
        String iBAN = reader.readString("IBAN");
        String firstName = reader.readString("customerFirstName");
        String lastName = reader.readString("customerLastName");
        double balance = reader.readDouble("balance");
        String currency = reader.readString("currency");
        long customerId = reader.readInt64("customerId");



        reader.readEndDocument();
        Account account = new Account(iBAN, balance, currency);
        Customer customer = new Customer(firstName, lastName, customerId, account);
        AccountDTO doc = new AccountDTO(account, customer);
        return doc;
    }

}
package utils;

import org.bson.codecs.Codec;
import org.bson.codecs.configuration.CodecProvider;
import org.bson.codecs.configuration.CodecRegistry;

import dto.AccountDTO;

class MyCodecProvider implements CodecProvider {    
    public <T> Codec<T> get(Class<T> myClass, CodecRegistry codecRegistry) {
        if (myClass== AccountDTO.class) {
            return (Codec<T>) new MyAccountDTOImpCodec(codecRegistry);
        }
        return null;
    }
}
我认为这是一个糟糕的实现,在
Node.js
中,我会发送我的
json
对象,将
java
对象发送到
MongoDB
似乎很奇怪


这只是对
javadoc
的错误解释还是我的代码中的某种缺失?

您必须为Java类实现编解码器,然后MongoDB将能够将BSON值解码为Java对象,并将Java对象编码为BSON值。看看这个Mongo Java驱动程序文档:

这将是表示MongoDB集合中文档的POJO类:

class MyDocument {
    private String id;
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "MyDocument [id=" + id + ", name=" + name + "]";
    } 
}
我们需要创建一个类来实现编解码器接口,它还扩展了接口:
编码器
解码器
。此类将提供将MyDocument Java对象编码和解码为BSON文档所需的方法

class MyDocumentImpCodec implements Codec<MyDocument> {

    private CodecRegistry codecRegistry;

    public MyDocumentImpCodec(CodecRegistry codecRegistry) {
        this.codecRegistry = codecRegistry;
    }

    public void encode(BsonWriter writer, MyDocument doc, EncoderContext encoderContext) {
        writer.writeStartDocument();
        writer.writeName("_id");
        writer.writeString(doc.getId());
        writer.writeName("name");
        writer.writeString(doc.getName());
        writer.writeEndDocument();
    }

    public MyDocument decode(BsonReader reader, DecoderContext decoderContext) {
        reader.readStartDocument();
        String id = reader.readString("_id");
        String name = reader.readString("name");
        reader.readEndDocument();

        MyDocument doc = new MyDocument();
        doc.setId(id);
        doc.setName(name);
        return doc;
    }    

    public Class<MyDocument> getEncoderClass() {
        return MyDocument.class;
    }
}
类MyDocumentImpCodec实现编解码器{
私人编码中心注册中心;
公共MyDocumentImpCodec(编解码器注册表编解码器注册表){
this.codecRegistry=codecRegistry;
}
public void encode(BsonWriter writer、MyDocument doc、EncoderContext EncoderContext){
writer.writeStartDocument();
writer.writeName(“_id”);
writer.writeString(doc.getId());
writer.writeName(“名称”);
writer.writeString(doc.getName());
writer.writeEndDocument();
}
公共MyDocument解码(BsonReader阅读器,DecoderContext DecoderContext){
reader.readStartDocument();
String id=reader.readString(“_id”);
字符串名称=reader.readString(“名称”);
reader.readEndDocument();
MyDocument doc=新建MyDocument();
文件设置id(id);
文件名(名称);
退货单;
}    
公共类getEncoderClass(){
返回MyDocument.class;
}
}
编解码器提供程序是编解码器实例的工厂

class MyCodecProvider implements CodecProvider {    
    public <T> Codec<T> get(Class<T> myClass, CodecRegistry codecRegistry) {
        if (myClass == MyDocument.class) {
            return (Codec<T>) new MyDocumentImpCodec(codecRegistry);
        }
        return null;
    }
}
类提供程序实现编解码器提供程序{ 公共编解码器get(类myClass、编解码器注册表编解码器注册表){ if(myClass==MyDocument.class){ 返回(编解码器)新MyDocumentImpCodec(编解码器注册表); } 返回null; } } CodecRegistry类包含一组编解码器实例,这些实例根据编码和解码到的Java类进行访问。在我们的示例中,CodecRegistry实例仅获取我们之前定义的MyCodecProvider和

publicstaticmongocollection getDbCollection(){
// ...................................................
CodecRegistry CodecRegistry=CodecRegistries.fromRegistries(
CodecRegistries.fromProviders(新的MyCodecProvider()),
MongoClient.getDefaultCodecRegistry());
MongoClient选项=MongoClient选项
.builder()
.codecRegistry(codecRegistry)
.build();
// ...................................................
MongoClient MongoClient=新的MongoClient(MONGODB_服务器_IP,选项);
MongoDatabase=db=mongoClient.getDatabase(MONGODB_服务器_数据库_名称);
MongoCollection集合=db.getCollection(
MONGODB_服务器_集合_名称,
MyDocument.class);
回收;
}
实现DAO方法的示例:

public static void getDocument() {
    FindIterable<MyDocument> iterator = collection.find();

    for (MyDocument doc : iterator) {
        System.out.println(doc);
    }
}

public static void insertDocument() {
    MyDocument doc = new MyDocument();
    doc.setId("1001");
    doc.setName("myName");

    collection.insertOne(doc);
}
publicstaticvoid getDocument(){
FindItemerable迭代器=collection.find();
for(MyDocument文档:迭代器){
系统输出打印项次(doc);
}
}
公共静态void insertDocument(){
MyDocument doc=新建MyDocument();
文件setId(“1001”);
文件集名称(“myName”);
托收。插入通(doc);
}

您必须为Java类实现一个编解码器,然后MongoDB将能够将BSON值解码为Java对象,并将Java对象编码为BSON值。看看这个Mongo Java驱动程序文档:

这将是表示MongoDB集合中文档的POJO类:

class MyDocument {
    private String id;
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "MyDocument [id=" + id + ", name=" + name + "]";
    } 
}
我们需要创建一个类来实现编解码器接口,它还扩展了接口:
编码器
解码器
。此类将提供将MyDocument Java对象编码和解码为BSON文档所需的方法

class MyDocumentImpCodec implements Codec<MyDocument> {

    private CodecRegistry codecRegistry;

    public MyDocumentImpCodec(CodecRegistry codecRegistry) {
        this.codecRegistry = codecRegistry;
    }

    public void encode(BsonWriter writer, MyDocument doc, EncoderContext encoderContext) {
        writer.writeStartDocument();
        writer.writeName("_id");
        writer.writeString(doc.getId());
        writer.writeName("name");
        writer.writeString(doc.getName());
        writer.writeEndDocument();
    }

    public MyDocument decode(BsonReader reader, DecoderContext decoderContext) {
        reader.readStartDocument();
        String id = reader.readString("_id");
        String name = reader.readString("name");
        reader.readEndDocument();

        MyDocument doc = new MyDocument();
        doc.setId(id);
        doc.setName(name);
        return doc;
    }    

    public Class<MyDocument> getEncoderClass() {
        return MyDocument.class;
    }
}
类MyDocumentImpCodec实现编解码器{
私人编码中心注册中心;
公共MyDocumentImpCodec(编解码器注册表编解码器注册表){
this.codecRegistry=codecRegistry;
}
public void encode(BsonWriter writer、MyDocument doc、EncoderContext EncoderContext){
writer.writeStartDocument();
writer.writeName(“_id”);
writer.writeString(doc.getId());
writer.writeName(“名称”);
writer.writeString(doc.getName());
writer.writeEndDocument();
}
公共MyDocument解码(BsonReader阅读器,DecoderContext DecoderContext){
reader.readStartDocument();
String id=reader.readString(“_id”);
字符串名称=reader.readString(“名称”);
reader.readEndDocument();
MyDocument doc=新建MyDocument();
文件设置id(id);
文件名(名称);
退货单;
}    
公共类getEncoderClass(){
返回MyDocument.class;
}
}
编解码器提供程序是编解码器实例的工厂

class MyCodecProvider implements CodecProvider {    
    public <T> Codec<T> get(Class<T> myClass, CodecRegistry codecRegistry) {
        if (myClass == MyDocument.class) {
            return (Codec<T>) new MyDocumentImpCodec(codecRegistry);
        }
        return null;
    }
}
类提供程序实现编解码器提供程序{ 公共编解码器get(类myClass、编解码器注册表编解码器注册表){ if(myClass==MyDocument.class){ 返回(编解码器)新MyDocumentImpCodec(编解码器注册表); } 返回null; } } 编解码器注册表类包含
public static void getDocument() {
    FindIterable<MyDocument> iterator = collection.find();

    for (MyDocument doc : iterator) {
        System.out.println(doc);
    }
}

public static void insertDocument() {
    MyDocument doc = new MyDocument();
    doc.setId("1001");
    doc.setName("myName");

    collection.insertOne(doc);
}