Mongo Java Driver 3 - 使用对象扩展' Document'

时间:2016-01-28 00:33:54

标签: java mongodb

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

2 个答案:

答案 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驱动程序的异步版本。