Mongo Java Driver 3添加了对Codec infrastructure的支持,我将在下面尝试。默认情况下,它带有以下3个对象的编解码器:Document,BasicDBObject和BsonDocument。
我尝试通过让我的类MyClass扩展Document来做一些非常简单的事情。但是它失败并显示内联指示的错误。
我发现这个gist但是看起来过于复杂..是不是有一种简单的方法可以将MyClass注册为编解码器,因为它也是一个文档?
谢谢。 -henning
public class PlayMongo {
static class MyClass extends Document {
public MyClass(String key, Object value) {
super(key, value);
}
}
public static void main(String[] args) {
MongoClient mongoClient = new MongoClient();
MongoDatabase db = mongoClient.getDatabase("test");
// Works like a charm
MongoCollection<Document> documentCollection = db.getCollection("docs");
documentCollection.insertOne(new Document().append("hello", "world"));
// Fails with CodecConfigurationException: Can't find a codec for class play.reactivemongo.PlayMongo$MyClass
MongoCollection<MyClass> myClassCollection = db.getCollection("myclasses", MyClass.class);
myClassCollection.insertOne(new MyClass("hello", "world"));
}
}
答案 0 :(得分:1)
最简单的方法是使用Morphia。 Morphia准备将Java对象映射到MongoDB集合。我做了一个例子,你可以看到它是如何工作的。在此示例中,MongoDB有一个名为people
的集合,它映射到名为Person
的Java类。 Person
看起来像这样:
@Entity("people")
public class Person {
private String firstName;
private String lastName;
//obrigactory constructor for Morphia
public Person() {
}
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
@Override
public String toString() {
return firstName + " " + lastName;
}
}
由于Entity
注释,Morphia知道Person对象对应于people集合。它还需要一个没有参数的构造函数来正确转换对象,这就是为什么我们有一个。
MongoDB Java驱动程序已经非常简单,但Morphia使得进行CRUD操作变得更加简单。下一个代码块将在数据库中插入和检索一个人:
Morphia morphia = new Morphia();
Datastore datastore = morphia.createDatastore(new MongoClient(), "test");
Person johnDoe = new Person("John", "Doe");
//saves John Doe on DB
datastore.save(johnDoe);
//retrieves all people whose first name is John
List<Person> people = datastore.createQuery(Person.class).filter("firstName", "John").asList();
System.out.println(people.size()); //prints 1
Person person = people.get(0);
System.out.println(person); //prints John Doe
正如您所看到的,我们只需要说明将使用哪个Java类,然后Morphia可以根据它找到的注释发现正确的集合。在那之后,一个简单的save
足以将对象插入数据库。要检索数据基本上是相同的过程:通知您想要的课程以及过滤器。
重要的是要记住,Morphia会带来额外的性能成本。在大多数情况下,它不会产生任何影响,但您需要评估您的场景并运行自己的一些测试。
答案 1 :(得分:1)
我创建了一个小型库,用于自动为POJO创建编解码器。如果您不想使用像Morphia这样的大型图书馆,请查看:
https://github.com/dozd/mongo-mapper
适用于同步以及新mongo驱动程序的异步版本。