2011-07-24 13 views
5

Mam poniższy kod, który działa:Mongo Database zapisać dane z mapą

if (aDBCursor.hasNext()) { 
    DBObject aDbObject = aDBCursor.next(); 
    aDbObject.put("title", "Test Title"); 
    ArrayList<DBObject> department = new ArrayList<DBObject>(); 

    DBObject nested1 = new BasicDBObject(); 
    nested1.put("name", "Department A"); 
    nested1.put("id", 1); 
    department.add(nested1); 

    DBObject nested2 = new BasicDBObject(); 
    nested2.put("name", "Department B"); 
    nested2.put("id", 2); 
    department.add(nested2); 

    aDbObject.put("department", department); 
    collection.save(aDbObject); 
} 

Jednak mam danych dla dział A i B na mapie jak:

Map<Object,Object> map = new HashMap<Object,Object>(); 
map.put("1", "Department A"); 
map.put("2", "Department B"); 

Co byłoby najlepszym/najprościej zapisać te dane? Czy istnieje sposób na umieszczenie mapy bezpośrednio w DB Mongo? Czy musiałbym zapętlić mapę?

Dane, które przechodzi w mapie już jest pobierana z bazy danych tak:

String[] values = req.getParameterValues("departments"); 
Map<Object,Object> map = new HashMap<Object,Object>(); 

DBCollection collection = database.getCollection("Departments"); 
BasicDBObject query = new BasicDBObject(); 
query.put("id", new BasicDBObject("$in", values)); 
DBCursor cursor = collection.find(query); 

Byłoby jeszcze lepiej, to może po prostu umieścić DBCursor obiekt z powrotem do bazy.

Wszelkie pomysły?

Dzięki za pomoc lub sugestie!

Odpowiedz

5

rodzaje Język Java (int, float, String, Date, Map, etc) dostanie automatycznie kodowane do właściwego rodzaju BSON, więc można użyć BasicDBObject umieścić Map prosto do kolekcji Mongo:

// you probably want to be more specific with your generics than Object! 
Map<Object,Object> map = new HashMap<Object,Object>(); 
map.put("1", "Department A"); 
map.put("2", "Department B"); 
collection.insert(new BasicDBObject(map)); 

Wygląda jednak na to, że Twój Map nie ma odpowiedniej struktury, więc potrzebujesz jakiegoś odwzorowania do pożądanej struktury. Użyj podstawowego mapowania wbudowanego w sterownik java (jesteś na dobrej drodze dzwoniąc pod numer BasicDBObject.put, a here to jeszcze kilka pomysłów) lub użyj czegoś takiego jak Morphia do rozszerzonego mapowania.

0

What would the best/easiest way be to save this data? Is there a way to put the map straight into the mongo DB? Or would I have to loop over the map? Mapę można bezpośrednio dodać do BasicDBObject przez samego konstruktora. Można go bezpośrednio wstawić do db bez iteracji.

Would be even better is I could just put the DBCursor object back into the database. 

DBCursor realizuje iterator, więc nie można go umieścić z powrotem w db bez iteracji

2

Ok chłopaki, mam to działa.

String[] values = req.getParameterValues("departments"); 
Map<Object,Object> map = new HashMap<Object,Object>(); 

DBCollection collection = database.getCollection("Departments"); 
BasicDBObject query = new BasicDBObject(); 
query.put("id", new BasicDBObject("$in", values)); 
DBCursor cursor = collection.find(query); 



if(aDBCursor.hasNext()){ 
     DBObject aDbObject=aDBCursor.next(); 
     aDbObject.put("title", "Test Title"); 
     aDbObject.put("department", cursor); 
     collection.save(aDbObject); 
    } 

To proste!

Dzięki za wszystkie odpowiedzi i sugestie!