2013-01-09 9 views
7

Ich habe eine MongoDB Struktur wie folgt aus:

record = { 'field': 'value', 
      'field2': 'value2', 
      'events' : [ { 'event1': 1 }, { 'event2' : 2 }] 
     } 

Ich bin mit Spring Data MongoDB Paket auf diese Daten zugreifen. Es wird hauptsächlich Schreibvorgänge auf die Daten geben, daher würde ich gerne die native "$ push" -Funktion verwenden, um "Ereignisse" zu dem "Datensatz" hinzuzufügen, aber ich kann nicht herausfinden, wie man es mit MongoRepository ohne Abrufen macht die gesamte Aufzeichnung und dann schieben und speichern Sie es zurück?

Wenn Sie MongoRepository verwenden, haben Sie nie wirklich eine konkrete Implementierung. Frühling kümmert sich um alles basiert auf Anmerkungen oder die Namen der Methoden selbst

UPDATE

Wäre der richtige Weg zu sein, eine benutzerdefinierte Methode auf das Repository zu implementieren und dann MongoTemplate, um es manuell zu tun?

Beispiel:

FooRepository.java

public interface FooRepository extends 
    CrudRepository<Foo, ObjectId>, 
     AppointmentWarehouseRepositoryCustom { 
} 

FooRepositoryCustom.java

public interface AppointmentWarehouseRepositoryCustom { 
    public void pushMethod(); 
} 

FooRepositoryImpl.java

Antwort

13

Ja, Sie müssen eine benutzerdefinierte Methode auf dem Repository und Ihre push Methode so etwas wie dies wäre implementieren:

public class FooRepositoryImpl implements 
    AppointmentWarehouseRepositoryCustom { 

    @Autowired 
    protected MongoTemplate mongoTemplate; 

    public void pushMethod(String objectId, Object... events) { 
     mongoTemplate.updateFirst(
      Query.query(Criteria.where("id").is(objectId)), 
      new Update().pushAll("events", events), Foo.class); 
    } 
} 
+0

Und können wir ein Objekt in einer Liste als @DBRef markiert schieben? – javadev

+0

Ist es zufällig passiert, dass Sie eine @DBRef-Sammlung einfügen? – javadev

5

Sie dies tun können, aber ich lief in ein Problem, wo die „_class“ Feld wasn wird nicht erhalten. Das gedrückte Objekt selbst wurde durch den konfigurierten Konverter ausgeführt, aber aus irgendeinem Grund wurde das "_class" -Feld dieses gedrückten Objekts nicht geschrieben. Wenn ich jedoch den Konverter injizierte und das Objekt selbst in ein DBObject schrieb, wurde das Feld "_class" beibehalten und geschrieben. Das wird so:

public class FooRepositoryImpl implements 
AppointmentWarehouseRepositoryCustom { 

@Autowired 
protected MongoTemplate mongoTemplate; 

public void pushMethod(String objectId, Object event) { 
    DBObject eventObj = new BasicDBObject(); 
    converter.write(event, eventObj); 
    mongoTemplate.updateFirst(
     Query.query(Criteria.where("id").is(objectId)), 
     new Update().push("events", eventObj), Foo.class); 
    } 
} 
Verwandte Themen