2015-03-13 13 views
13

sto usando un:Spring MongoRepository aggiorna o upserting invece di inserire

org.springframework.data.mongodb.repository.MongoRepository 

parto da un DB vuoto e creare un oggetto con _id = 1234 per esempio, e impostare altri campi della stringa di hello per esempio , e quindi:

repository.save(object); 

Tutto va bene, salva il documento in MondoDB.

creare un nuovo oggetto, impostare lo stesso _id = 1234 ma impostare l'altro campo Stringa da world e poi ad un altro salvataggio:

repository.save(newObject); 

risultati: il salvataggio opere, ma aggiorna l'oggetto originale.

Risultati previsti: questo non dovrebbe riuscire con uno DuplicateKeyException come _id è univoco e sto utilizzando 2 oggetti separati quando eseguo ogni salvataggio.

Difetto in primavera o sto facendo qualcosa di sbagliato ???

risposta

18

Salva, per definizione, si suppone che aggiorni un oggetto nello stile upsert, aggiorna se presente e inserisce se non. Leggere la documentazione save operazione sul MongoDb website

Il inserto operazione MongoDB ha il comportamento che ci si aspetta, ma dalla documentazione MongoRepository sembra che inserto è delegata per salvare in modo che non farà alcuna differenza. Ma puoi provare e vedere se funziona per te. Altrimenti puoi semplicemente fare un salto prima per verificare se l'oggetto esiste, poiché è una ricerca di indice che sarà veloce.

+0

Il problema è che '_id' sembra comportarsi diversamente da qualsiasi altro campo. Per esempio, se ho un campo chiamato 'name' nel documento mongo, e creo un indice UNIQUE su quel campo, facendo i passi menzionati nella mia domanda si otterrà un' DuplicateKeyException' previsto. Inoltre, per l'API mongorepository di primavera, non esiste l'API 'insert', solo' save'. Ho la sensazione che questo sia un bug in primavera. – Marc

+2

C'è un metodo di inserimento: http://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/repository/MongoRepository.html#insert-S- – tinker

+0

L'indice la validazione è diversa, l'ottimizzazione in save è che può aggiornare direttamente l'oggetto se viene trovato, questo è in base alla progettazione. – tinker

Problemi correlati