MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Morphia List>> return Embedded element is not a DBObject on find operation

Morphia betrachtet Map als eine DB-Referenz zu einem anderen Dokument, anstatt es als eingebettete Klasse zu sehen und als Dokument zu behandeln. Die Lösung wäre, die Map mit @Embedded zu kommentieren, aber das ist nicht möglich, da Sie die Map-Klasse nicht bearbeiten können.

Es gibt eine Möglichkeit, etwas Ähnliches wie das zu erreichen, was Sie versuchen, indem Sie eine andere Klasse erstellen und die Map als Eigenschaft dieser Klasse definieren und sie als @Embedded.

kommentieren

Ändern Sie die Temp-Klasse:

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

und erstellen Sie eine neue Klasse:

@Embedded
public class MapProxy {
    public Map<String,Object> m = new HashMap<String, Object>();

}

Ich habe die von mir vorgenommenen Änderungen markiert.

Die Struktur, die dies erzeugt, sieht folgendermaßen aus:

{
    "_id" : "hi",
    "className" : "YOUR CLASS NAME HERE",
    "strings" : 
                [ { 
                     "m" : 
                            { 
                                "Hi" : "1" , 
                                "Hi2" : 2
                            } 
                } ]
}