我对MongoDB/JSON相当陌生,所以这可能很简单,但我找不到满意的答案。在MongoDB中插入包含集合的对象
比方说,我有如下定义的2类(在现实要复杂得多):
public class Instrument {
public String name;
public List<Identifier> identifiers;
}
public class Identifier {
public String type;
public String value;
}
因此一个仪器可以有多个标识符。 现在我有一个List<Instrument>
,我想存储在一个名为“乐器”的Mongo集合中。
到目前为止,我发现的唯一方法是通过逐个插入字段手动创建每个文档(请参阅下面完整工作示例中的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;
}
}
}
我已经尝试过它,它似乎正是我所需要的。感谢您的链接。 – assylias 2012-02-22 17:22:12