Mongodb 指定要将嵌入式文档解码到的java类型
我有一个简单的java类型Mongodb 指定要将嵌入式文档解码到的java类型,mongodb,mongodb-java,Mongodb,Mongodb Java,我有一个简单的java类型 public class Type1_ { private int number1; private int number2; public Type1_(int number1, int number2) { this.number1 = number1; this.number2 = number2; } public int getNumber1() { return
public class Type1_ {
private int number1;
private int number2;
public Type1_(int number1, int number2) {
this.number1 = number1;
this.number2 = number2;
}
public int getNumber1() {
return number1;
}
public int getNumber2() {
return number2;
}
@Override
public String toString() {
return "Type1_{number1=" + number1 + ", number2=" + number2 + '}';
}
public static Type1_ random() {
return new Type1_(new SecureRandom().nextInt(), new SecureRandom().nextInt());
}
}
为这种类型创建了一个简单的编解码器
(让记录器知道何时或是否正在使用它们)
创建了一个测试,该测试使用包含Type1\u编解码器的编解码器注册表,并尝试插入(编码)和读取(解码)Type1\u
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class Codecs {
@Test
public void demonstrate_simpleCustomCodec() {
final MongoClient mongoClient = buildMongoClientWithCustomCodec(CustomCodecRegistriesFactory.getDefaultWithType1_());
final MongoDatabase db = mongoClient.getDatabase("db_" + new SecureRandom().nextInt(Integer.MAX_VALUE));
final String collectionName = "col1";
db.createCollection(collectionName);
final MongoCollection<Document> col1 = db.getCollection(collectionName);
int idCounter = 0;
final String type1_field = "type1_";
printTitle("Inserting Documents");
for (int i = 0; i < 10; i++) {
/*Encoding is done at insertion*/
col1.insertOne(new Document(ID, idCounter++).append(type1_field, Type1_.random()));
}
printDocumentMongoCollection(col1);
printMongoCollectionJackson(col1);
printTitle("Attempting Decoding");
/*attempt decoding*/
// final Type1_ type1_value = col1.find().first().get(type1_field, Type1_.class);
// System.out.println(type1_value);
}
}
@TestInstance(TestInstance.Lifecycle.PER_类)
公共类编解码器{
@试验
公共空间{
final MongoClient MongoClient=buildmongoclienttwithcustomcodec(customcodecorderegisteresfactory.getDefaultWithType1_());
final MongoDatabase db=mongoClient.getDatabase(“db_3;”+new SecureRandom().nextInt(Integer.MAX_值));
最终字符串collectionName=“col1”;
db.createCollection(collectionName);
最终MongoCollection col1=db.getCollection(collectionName);
int-idCounter=0;
最终字符串类型1\u field=“类型1\u”;
打印标题(“插入文件”);
对于(int i=0;i<10;i++){
/*编码在插入时完成*/
col1.insertOne(新文档(ID,idCounter++).append(type1_字段,type1_u.random());
}
打印文档MongoCollection(col1);
printMongoCollectionJackson(col1);
打印标题(“尝试解码”);
/*尝试解码*/
//final Type1_u1_value=col1.find().first().get(Type1_字段,Type1_u.class);
//系统输出打印LN(类型1_值);
}
}
问题出在解码部分。
如何为MongoClient指定要将特定文档解码为Type1\uu
type
注释掉的代码将尝试将文档
强制转换为类型1
,并将失败。使用db.getCollection(collectionName,Type1.class)
来“键入”您的集合。这应该会把你的编解码器拉进来为你自动播放
public class CustomCodecRegistriesFactory {
public static CodecRegistry getDefault() {
return MongoClientSettings.getDefaultCodecRegistry();
}
public static CodecRegistry getDefaultWithType1_() {
return CodecRegistries.fromRegistries(CodecRegistries.fromCodecs(new Type1_Codec()), getDefault());
}
}
public class MongoDBClientConfig {
public static MongoClient buildMongoClientWithCustomCodec(final CodecRegistry codecRegistry) {
return MongoClients.create(MongoClientSettings.builder()
.applyToClusterSettings(builder -> {
builder.hosts(Arrays.asList(new ServerAddress(url(), port())));
})
.codecRegistry(codecRegistry)
.build());
}
}
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
public class Codecs {
@Test
public void demonstrate_simpleCustomCodec() {
final MongoClient mongoClient = buildMongoClientWithCustomCodec(CustomCodecRegistriesFactory.getDefaultWithType1_());
final MongoDatabase db = mongoClient.getDatabase("db_" + new SecureRandom().nextInt(Integer.MAX_VALUE));
final String collectionName = "col1";
db.createCollection(collectionName);
final MongoCollection<Document> col1 = db.getCollection(collectionName);
int idCounter = 0;
final String type1_field = "type1_";
printTitle("Inserting Documents");
for (int i = 0; i < 10; i++) {
/*Encoding is done at insertion*/
col1.insertOne(new Document(ID, idCounter++).append(type1_field, Type1_.random()));
}
printDocumentMongoCollection(col1);
printMongoCollectionJackson(col1);
printTitle("Attempting Decoding");
/*attempt decoding*/
// final Type1_ type1_value = col1.find().first().get(type1_field, Type1_.class);
// System.out.println(type1_value);
}
}