Morphia ser Map som en DB-reference til et andet dokument i stedet for at se det som en indlejret klasse og behandle det som et dokument. Løsningen ville være at annotere kortet @Embedded, men dette er ikke muligt, da du ikke kan redigere kortklassen.
Der er en måde at opnå noget, der ligner det, du forsøger, ved at oprette en anden klasse og definere kortet som en egenskab for denne klasse og annotere det som @Embedded.
Skift Temp-klassen:
public class Temp {
@Id String _id;
@Embedded // CHANGE HERE
List<MapProxy> strings; // CHANGE HERE
public Temp(){
strings=new LinkedList<MapProxy>(); // CHANGE HERE
}
public static void main(String...args) throws UnknownHostException, MongoException{
Mongo mongo=null;
Morphia morphia=null;
Datastore ds=null;
mongo = new Mongo();
morphia = new Morphia();
morphia.map(Temp.class);
ds = morphia.createDatastore(mongo, "test2");
Temp t = new Temp();
t._id ="hi";
MapProxy mp = new MapProxy(); // CHANGE HERE
mp.m.put("Hi","1"); // CHANGE HERE
mp.m.put("Hi2",2); // CHANGE HERE
t.strings.add(mp); // CHANGE HERE
ds.save(t);
t=ds.get(t);
ds.ensureIndexes();
}
}
og opret en ny klasse:
@Embedded
public class MapProxy {
public Map<String,Object> m = new HashMap<String, Object>();
}
Jeg har markeret de ændringer, jeg har foretaget.
Strukturen, som dette producerer, er som denne:
{
"_id" : "hi",
"className" : "YOUR CLASS NAME HERE",
"strings" :
[ {
"m" :
{
"Hi" : "1" ,
"Hi2" : 2
}
} ]
}