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