Вставка объектов, содержащих коллекции, в MongoDB - PullRequest
3 голосов
/ 22 февраля 2012

Я довольно новичок в MongoDB / JSON, так что это может быть очень просто, но я не могу найти удовлетворительный ответ.

Допустим, у меня есть 2 класса, определенных ниже (на самом деле гораздо более сложный):

public class Instrument {
    public String name;
    public List<Identifier> identifiers;
}

public class Identifier {
    public String type;
    public String value;
}

Таким образом, один инструмент может иметь несколько идентификаторов.Теперь у меня есть List<Instrument>, который я хотел бы сохранить в коллекции Mongo под названием «instruments».
Единственный способ, который я нашел до сих пор, - это создать каждый документ вручную, вставив их поля одно за другим (см. getDocFromInstrument метод в полном рабочем примере ниже).Это очень громоздко и подвержено ошибкам + полностью связано с базовыми классами.

Есть ли лучший способ сделать это?
И так как мне нужно будет вернуть информацию на каком-то этапе, любые идеи покак "автоматически" воссоздать объекты из базы данных тоже приветствуется.

Для информации выводим код ниже:

{ "_id" : { "$oid" : "4f44db111d8bc98c289b5d82"} , "name" : "inst1" , "identifiers" : [ { "type" : "type1" , "value" : "inst1_type1"} , { "type" : "type2" , "value" : "inst1_type2"}]}
{ "_id" : { "$oid" : "4f44db111d8bc98c289b5d83"} , "name" : "inst2" , "identifiers" : [ { "type" : "type1" , "value" : "inst2_type1"} , { "type" : "type2" , "value" : "inst2_type2"}]}

Полный код:

public class TestMongo {

    private final static String IP = "192.168.3.12";
    private final static String DB_NAME = "test";
    private final static int DEFAULT_PORT = 27017;

    public static void main(String[] args) {
        DB db = null;
        try {
            db = new Mongo(IP, DEFAULT_PORT).getDB(DB_NAME);
            insertSomething(db);
            printContent(db);
            cleanDb(db);
        } catch (Exception e) {
            System.out.println(e);
        } finally {
            if (db != null) {
                db.getMongo().close();
            }
        }
    }

    private static void insertSomething(DB db) {
        Identifier idInst1_1 = new Identifier("type1", "inst1_type1");
        Identifier idInst1_2 = new Identifier("type2", "inst1_type2");
        Identifier idInst2_1 = new Identifier("type1", "inst2_type1");
        Identifier idInst2_2 = new Identifier("type2", "inst2_type2");

        Instrument inst1 = new Instrument("inst1", Arrays.asList(idInst1_1, idInst1_2));
        Instrument inst2 = new Instrument("inst2", Arrays.asList(idInst2_1, idInst2_2));

        BasicDBObject doc1 = getDocFromInstrument(inst1);
        BasicDBObject doc2 = getDocFromInstrument(inst2);

        DBCollection instrumentsCollection = db.getCollection("instruments");
        instrumentsCollection.insert(doc1);
        instrumentsCollection.insert(doc2);
    }

    private static void printContent(DB db) {
        DBCollection instrumentsCollection = db.getCollection("instruments");
        DBCursor cur = instrumentsCollection.find();

        while(cur.hasNext()) {
            System.out.println(cur.next());
        }
    }

    private static void cleanDb(DB db) {
        db.dropDatabase();
    }

    private static BasicDBObject getDocFromInstrument(Instrument instrument) {
    BasicDBObject instrumentDoc = new BasicDBObject();
    instrumentDoc.put("name", instrument.name);
    List<BasicDBObject> identifiers = new ArrayList<>();
    for (Identifier identifier : instrument.identifiers) {
        BasicDBObject identifierDoc = new BasicDBObject();
        identifierDoc.put("type", identifier.type);
        identifierDoc.put("value", identifier.value);
        identifiers.add(identifierDoc);
    }
    instrumentDoc.put("identifiers", identifiers);
        return instrumentDoc;
    }

    static class Instrument {
        public String name;
        public List<Identifier> identifiers;

        public Instrument(String name, List<Identifier> ids) {
            this.name = name;
            this.identifiers = ids;
        }

    }

    static class Identifier {
        public String type = "";
        public String value = "";

        public Identifier(String type, String values) {
            this.type = type;
            this.value = values;
        }

    }
}

Ответы [ 4 ]

3 голосов
/ 22 февраля 2012

Существует несколько инструментов ORM, которые вы можете попробовать. Но Morphia является наиболее стабильным из них.

3 голосов
/ 22 февраля 2012

Взгляните на Morphia, это Java ORM для MongoDB:

Morphia - Java ORM в / из MongoDB

Я использую его для своего кода Java, и мои классы очень похожи на ваши. У меня не было проблем с вложением списков объектов в другие объекты. Morphia использует отражение для преобразования ваших классов в JSON, поэтому он будет обрабатывать большую часть вашего кода для вас (например, функцию getDocFromInstrument). Надеюсь, это поможет.

1 голос
/ 03 мая 2012

https://github.com/impetus-opensource/Kundera/wiki/Kundera-Mongo-performance

Это скомпилированное сравнение производительности ч / б Kundera, Spring Data, Morphia и Native API.

Это должно дать вам представление о том, какой из них лучше.Kundera предоставляет платформу расширения клиента (способ обработки других требований mongodb).

0 голосов
/ 21 февраля 2013

На сайте mongo есть список картографов Java POJO .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...