2016-11-10 13 views
5

Jestem nowy w Dane wiosenne Mongo. Mam scenariusz, w którym chcę utworzyć Studium, jeśli nie ma go w bazie danych Mongo. Jeśli już jest, to muszę go zaktualizować o nowe wartości.Jak zaktualizować dokument w Mongo, aby uzyskać wydajność?

Próbowałem w następujący sposób, który działa dobrze w moim przypadku, ale nie jestem pewien, czy jest to właściwy/najlepszy/zalecany sposób aktualizacji itp., Jeśli chodzi o wydajność.

Czy ktokolwiek mógłby poprowadzić ten temat?

public void saveStudy(List<Study> studies) { 
     for (Study study : studies) { 
      String id = study.getId(); 
      Study presentInDBStudy = studyRepository.findOne(id); 

      //find the document, modify and update it with save() method. 
      if(presentInDBStudy != null) { 
       presentInDBStudy.setTitle(task.getTitle()); 
       presentInDBStudy.setDescription(study.getDescription());  
       presentInDBStudy.setStart(study.getStart()); 
       presentInDBStudy.setEnd(study.getEnd()); 
       repository.save(presentInDBStudy); 
      } 
      else 
       repository.save(study); 
     } 
    } 

Odpowiedz

2

Aby to osiągnąć, konieczne będzie użycie MongoTemplate.upsert(). Trzeba będzie dodać jeszcze dwie klasy: StudyRepositoryCustom będąca interface i klasę, która rozciąga się ten interfejs, powiedzmy StudyRepositoryImpl

interface StudyRepositoryCustom { 
    public WriteResult updateStudy(Study study); 
} 

zaktualizować bieżący StudyRepository do extend to interface

@Repository 
public interface StudyRepository extends MongoRepository<Study, String>, StudyRepositoryCustom { 
    // ... Your code as before 
} 

i dodać klasa, która implementuje StudyRepositoryCustom. Tutaj będziemy @Autowire nasz MongoTemplate i przedstawimy implementację aktualizacji Study lub zapisania go, jeśli nie istnieje. Używamy metody MongoTemplate.upsert().

class StudyRepositoryImpl implements StudyRepositoryCustom { 
    @Autowired 
    MongoTemplate mongoTemplate; 

    public WriteResult updateStudy(Study study) { 
     Query searchQuery = new Query(Criteria.where("id").is(study.getId()); 
     WriteResult update = mongoTemplate.upsert(searchQuery, Update.update("title", study.getTitle).set("description", study.getDescription()).set(...)), Study.class); 
     return update; 
    } 
} 

Prosimy pamiętać, że StudyRepositoryImpl zostanie automatycznie odbierane przez infrastrukturę Wiosna danych jak my następnie konwencję nazewnictwa rozszerzenia nazwy interfejsu repozytorium rdzenia z Impl

Sprawdź this przykład na github na @Autowire -ing a MongoTemplate i używanie niestandardowego repozytorium jak wyżej.

nie testowałem kodu, ale będzie Cię :-)

1

Można aktualizować swój kod do korzystania <S extends T> List<S> save(Iterable<S> entites); zapisać wszystkich podmiotów. Wiosna MongoRepository zajmie się wszystkimi możliwymi przypadkami w oparciu o obecność pola _id i jego wartość.

Więcej informacji tutaj https://docs.mongodb.com/manual/reference/method/db.collection.save/

to będzie działać dobrze na podstawowe operacje składowania. Nie trzeba ładować dokumentu do aktualizacji. Po prostu ustaw identyfikator i pamiętaj, aby uwzględnić wszystkie pola aktualizacji podczas aktualizacji, zastępując istniejący dokument.

uproszczony Domain obiektu:

@Document(collection = "study") 
public class Study { 
    @Id 
    private String id; 
    private String name; 
    private String value; 
} 

Repozytorium:

public interface StudyRepository extends MongoRepository<Study, String> {} 

Wyobraź sobie, że rekord z istniejącym stanem _id = 1

Collection przed:

{ 
     "_id" : 1, 
     "_class" : "com.mongo.Study", 
     "name" : "saveType", 
     "value" : "insert" 
} 

uruchomić wszystkie możliwe przypadki: stan

public void saveStudies() { 
     List<Study> studies = new ArrayList<Study>(); 

     --Updates the existing record by replacing with the below values. 
     Study update = new Study(); 
     update.setId(1); 
     update.setName("saveType"); 
     update.setValue("update"); 

     studies.add(update); 

     --Inserts a new record. 
     Study insert = new Study(); 
     insert.setName("saveType"); 
     insert.setValue("insert"); 

     studies.add(insert); 

     --Upserts a record. 
     Study upsert = new Study(); 
     upsert.setId(2); 
     upsert.setName("saveType"); 
     upsert.setValue("upsert"); 

     studies.add(upsert); 

     studyRepository.save(studies); 

    } 

Odbiór po:

{ 
     "_id" : 1, 
     "_class" : "com.mongo.Study", 
     "name" : "saveType", 
     "value" : "update" 
} 
{ 
     "_id" : 3, 
     "_class" : "com.mongo.Study", 
     "name" : "saveType", 
     "value" : "insert" 
} 
{ 
     "_id" : 2, 
     "_class" : "com.mongo.Study", 
     "name" : "saveType", 
     "value" : "upsert" 
} 
Powiązane problemy