/ / Salvataggio del documento la prima volta con MongoTemplate - java, spring, mongodb, mongodb-query, spring-data-mongodb

Salvataggio del documento la prima volta con MongoTemplate - java, spring, mongodb, mongodb-query, spring-data-mongodb

Sto affrontando un problema nel salvataggio di un documento inprima volta con MongoTemplate. Ho molti record sul server contemporaneamente, questi record hanno la stessa identità, quindi salvo il primo record arrivato in mongo e tutti gli altri record aggiorneranno il documento salvato.

Esempio :

record1(id=x) , record2(id=x),record3(id=x),record4(id=x),record5(id=x),record6(id=x),.....

Devo solo salvare record1(id=x) e tutti gli altri per aggiornare il documento.

A causa della concorrenza, molti record sono stati salvati la prima volta. Esiste una soluzione integrata a questo problema prima di passare ad altre logiche.

risposte:

1 per risposta № 1

La soluzione base è chiamata a "Upsert". È una funzione incorporata su un MongoDB .update() metodo e portato attraverso tutti i driver.

Proprio come ogni invocazione del .update() metodo, questo richiede due parametri di base costituiti da un oggetto "query" e da un oggetto "aggiornamento". L'oggetto "aggiornamento" utilizza operatori per definire il comportamento di un aggiornamento. C'è una terza opzione nel modulo di comando generale che consente l'opzione a "Upsert" essere impostato.

Considera le seguenti affermazioni nella shell:

db.collection.update({ "_id": 1 },{ "$inc": { "counter": 1 } },{ "upsert" true })
db.collection.update({ "_id": 1 },{ "$inc": { "counter": 2 } },{ "upsert" true })
db.collection.update({ "_id": 1 },{ "$inc": { "counter": 3 } },{ "upsert" true })

Quale sarà la prima dichiarazione creare un nuovo documento con un valore "contatore" di 1. Le affermazioni successive aumenteranno nel 2 e 3 rispettivamente. Indipendentemente dall'ordine dell'esecuzione dell'istruzione, alla fine è presente un solo documento con un valore "contatore" di 6.

Nei dati di Spring MongoDB, l'istanza della classe mongoOperations ha un metodo chiamato .upsert() che fa la stessa cosa di base.

mongoOperations.upsert(query,update,Class.class)

0 per risposta № 2

Per la domanda specifica che hai chiesto (salvando solo un oggetto) dovresti usare MongoTemplate "s salvare() metodo. Vedere Qui per la documentazione.

Hai anche chiesto della concorrenza nel tuo esempio, MongoDB garantisce l'atomicità per documento. Ma dovresti esserne consapevole cross atomicity documentale non è fornito in MongoDB