MongoDB和Java:概念明确的愿景

时间:2016-05-04 08:10:18

标签: java mongodb nosql

我正在开发一个Java Web服务,允许用户与存储在mongoDB中的数据进行交互(CRUD操作)。从概念上讲,有一件事困扰着我:

Java是面向对象的,您在定义类时永久定义对象的属性,并且不应该在类定义后动态地修改它们。

对于我的Web服务,使用mongoDB是因为文档的结构和内容可能会随时间而变化。

我的印象是mongoDB和Java在灵活性方面并不相似。我没有找到任何来源讨论这个问题。

我考虑过两种不同的解决方案:

第一个解决方案

我的第一个想法是创建如下所示的模型类:

package classes;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

import org.bson.Document;
import org.bson.types.ObjectId;
import org.mongodb.morphia.annotations.Id;

import com.mongodb.DBObject;

@XmlRootElement
public class Plante extends Model{

    private ObjectId _id;
    private String name;

    public Plante(){}

    public Plante(String nom){
        this.name = nom;
    }

    public Plante(ObjectId id, String nom){
        this._id = id;
        this.name = nom;
    }

    @XmlElement
    public String get_id(){
        return this._id.toString();
    }

    @XmlElement
    public String getName(){
        return this.name;
    }

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

    public void set_id(ObjectId id){
        this._id = id;
    }

    public Document toDocument(){
        Document resultat = new Document();
        resultat.put("name", this.getName());
        return resultat;
    }
}

为了检索数据并插入数据,我有这种类型的功能:

@Override
public <T extends Model> ArrayList<T> findAll() {
    ArrayList<T> resultats = new ArrayList<T>();
    try {
        Gson gson = new Gson();

        FindIterable<Document> allDocs = this.collection.find();
        for(Document doc : allDocs){
            T element;
            element = (T) gson.fromJson(doc.toJson(), Class.forName("classes." + nomClasse));
            resultats.add(element);
        } 
    }
    catch (JsonSyntaxException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
    } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
    }
    return resultats;
}

@Override
public String insert(Model newM){
    this.collection.insertOne(newM.toDocument());
    return "OK";
}

但是,我觉得这个解决方案并不是很整洁,因为如果有人想添加一个具有新类型属性的Object,我的Web服务就会忽略这个新属性。

我正在使用Jersey(JAX-RS),这是我尝试进行“post”调用时调用的函数:

@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public Response postElement(final Plante plante){
    return super.post(plante);
}

如果我的代码不清楚,我很抱歉,架构相当复杂,对于理解这个问题并不重要。

第二个解决方案

由于与mongoDB文档相比,POJO并不灵活,我想到了另一种解决方案,我根本就没有任何“Object”类,但是由于调用了URL,我知道用户想要在哪个集合中插入一个对象。 例如:

http://localhost:8080/webservice/plante

在这个网址上有一个GET,我只需将请求正文中收到的JSON直接插入到“plante”集合中。

您对这两种解决方案有何看法?第二个是脏的吗?或者它比第一个更好? 还有其他解决方案吗?

PS :我现在无法真正改变语言,即使Java不是一个好的选择,因为我在实习结束时这个网络服务还做了很多其他的东西。

PS2 :如果我的问题看起来很愚蠢,我很抱歉,我是整个noSQL世界的新手

0 个答案:

没有答案