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;
}
}
}
Je l'ai essayé et il semble faire exactement ce dont j'avais besoin. Merci pour le lien. – assylias