2013-01-09 12 views
7

Ho una struttura MongoDB come questo:

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

Sto usando il pacchetto primavera dati MongoDB per accedere a questi dati. Ci saranno principalmente scritture sui dati, quindi mi piacerebbe usare la funzionalità nativa "$ push" per aggiungere "eventi" al "record", ma non riesco a capire come farlo con MongoRepository senza recuperare l'intero record e poi spingendolo e salvandolo di nuovo?

Quando si utilizza MongoRepository, non si ha mai realmente un'implementazione concreta. Primavera si occupa di tutto sulla base di annotazioni oi nomi dei metodi stessi

UPDATE

Sarebbe il modo corretto per essere quello di implementare un metodo personalizzato sul repository e quindi utilizzare MongoTemplate farlo manualmente?

Esempio:

FooRepository.java

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

FooRepositoryCustom.java

public interface AppointmentWarehouseRepositoryCustom { 
    public void pushMethod(); 
} 

FooRepositoryImpl.java

public class FooRepositoryImpl implements 
    AppointmentWarehouseRepositoryCustom { 

    @Autowired 
    protected MongoTemplate mongoTemplate; 

    public void pushMethod() { 
     // Push methods here. 
    } 
} 

risposta

13

Sì, è necessario implementare un metodo personalizzato sul repository e il metodo di push sarebbe qualcosa di simile a questo:

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

E possiamo inserire un oggetto in un elenco contrassegnato come @DBRef? – javadev

+0

Ti è capitato per caso di inserire una raccolta @DBRef? – javadev

5

Si può fare questo, ma mi sono imbattuto in un problema in cui il campo "_class" wasn essere preservato L'oggetto pushed è stato eseguito attraverso il convertitore configurato, ma per qualche motivo il campo "_class" dell'oggetto non è stato scritto. Tuttavia, se ho iniettato il convertitore e ho scritto l'oggetto su DBObject, il campo "_class" è stato conservato e scritto. Il valore diventa:

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); 
    } 
} 
Problemi correlati