2012-02-22 4 views
3

Je suis assez nouveau pour MongoDB/JSON, donc cela peut être très simple mais je ne trouve pas de réponse satisfaisante.Insérer des objets contenant des collections dans MongoDB

Disons que j'ai 2 classes définies ci-dessous (en réalité beaucoup plus complexe):

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

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

donc un instrument peut avoir plusieurs Identifiants. Maintenant, j'ai un List<Instrument> que je voudrais stocker dans une collection Mongo appelée "instruments".
La seule façon que j'ai trouvé jusqu'à présent est de créer chaque document manuellement en insérant leurs champs un par un (voir la méthode getDocFromInstrument dans l'exemple de travail complet ci-dessous). C'est très lourd et sujet aux erreurs + complètement couplé avec les classes sous-jacentes.

Y a-t-il une meilleure façon de faire cela?
Et comme j'aurai besoin de récupérer l'information à un moment donné, toutes les idées sur la façon de recréer "automatiquement" les objets à partir de la base de données sont également les bienvenues.

Pour plus d'informations, la sortie du code ci-dessous:

{ "_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"}]} 

code complet:

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

    } 
} 

Répondre

3

Jetez un oeil à Morphia, il est le Java ORM pour MongoDB:

Morphia - Java ORM to/from MongoDB Je l'utilise pour mon code Java et mes cours ressemblent beaucoup à y les notres. Je n'ai eu aucun problème pour imbriquer des listes d'objets dans d'autres objets. Morphia utilise la réflexion pour convertir vos classes en JSON, donc il va gérer beaucoup de votre code pour vous (comme votre fonction getDocFromInstrument). J'espère que cela pourra aider.

+0

Je l'ai essayé et il semble faire exactement ce dont j'avais besoin. Merci pour le lien. – assylias

Questions connexes