2013-01-09 3 views
7

J'ai une structure MongoDB comme ceci:

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

J'utilise package MongoDB données Spring pour accéder à ces données. Il y aura principalement des écritures sur les données, donc je voudrais utiliser la fonctionnalité native "$ push" pour ajouter des "événements" à "l'enregistrement", mais je n'arrive pas à comprendre comment le faire avec MongoRepository sans aller chercher l'ensemble du dossier, puis en le poussant et en le sauvegardant? Quand vous utilisez MongoRepository, vous n'avez jamais vraiment d'implémentation concrète. Poignées printemps tout en fonction des annotations ou les noms des méthodes elles-mêmes

MISE À JOUR

Est-ce que la bonne façon de mettre en œuvre une méthode personnalisée sur le référentiel, puis utiliser MongoTemplate pour le faire manuellement?

Exemple:

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. 
    } 
} 

Répondre

13

Oui, vous devez mettre en œuvre une méthode personnalisée sur le référentiel et votre méthode push serait quelque chose comme ceci:

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

Et pouvons-nous pousser un objet dans une liste marquée comme @DBRef? – javadev

+0

Est-ce que cela vous est arrivé par chance de pousser dans une collection @DBRef? – javadev

5

Vous pouvez faire cela, mais je suis tombé sur un problème où le champ « _class » WASN n'est pas conservé. L'objet poussé lui-même a été exécuté à travers le convertisseur configuré mais pour une raison quelconque, le champ "_class" de cet objet n'a pas été écrit. Cependant, si j'ai injecté le convertisseur et écrit moi-même l'objet dans DBObject, le champ "_class" a été préservé et écrit. Le devient ainsi:

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); 
    } 
} 
Questions connexes