Qual è la differenza tra findAndModify e update in MongoDB?

Sono un po ‘confuso dal metodo findAndModify in MongoDB. Qual è il vantaggio rispetto al metodo di update ? Per quanto mi riguarda, sembra che restituisca prima l’object e poi lo aggiorni. Ma perché devo prima restituire l’articolo? Ho letto MongoDB: la guida definitiva e dice che è utile per manipolare le code e svolgere altre operazioni che richiedono l’atomicità di stile get-and-set. Ma non ho capito come si raggiunge questo. Qualcuno può spiegarmelo?

Se recuperi un elemento e lo aggiorni, potrebbe esserci un aggiornamento da parte di un altro thread tra questi due passaggi. Se si aggiorna un object per primo e poi lo si preleva, potrebbe esserci un altro aggiornamento intermedio e si otterrà un elemento diverso da quello che si è aggiornato.

Farlo in modo “atomico” significa che hai la certezza che stai recuperando esattamente lo stesso object che stai aggiornando, ovvero che nessuna altra operazione può avvenire nel mezzo.

findAndModify restituisce il documento, l’aggiornamento no.

Se ho capito correttamente Dwight Merriman (uno degli autori originali di mongoDB), usando l’aggiornamento per modificare un singolo documento ie (“multi”: false} è anche atomico. Attualmente, dovrebbe anche essere più veloce di fare l’aggiornamento equivalente usando findAndModify .

Dai documenti MongoDB (enfasi aggiunta):

  • Per impostazione predefinita, entrambe le operazioni modificano un singolo documento. Tuttavia, il metodo update () con la sua opzione multipla può modificare più di un documento .

  • Se più documenti corrispondono ai criteri di aggiornamento, per findAndModify (), è ansible specificare un ordinamento per fornire una certa misura del controllo su quale documento aggiornare. Con il comportamento predefinito del metodo update (), non è ansible specificare quale singolo documento aggiornare quando più documenti corrispondono.

  • Per impostazione predefinita, il metodo findAndModify () restituisce la versione pre-modificata del documento . Per ottenere il documento aggiornato, utilizzare la nuova opzione. Il metodo update () restituisce un object WriteResult che contiene lo stato dell’operazione. Per restituire il documento aggiornato, utilizzare il metodo find (). Tuttavia, altri aggiornamenti potrebbero aver modificato il documento tra l’aggiornamento e il recupero del documento. Inoltre, se l’aggiornamento ha modificato solo un singolo documento ma più documenti corrispondono, sarà necessario utilizzare una logica aggiuntiva per identificare il documento aggiornato.

  • Non è ansible specificare un problema di scrittura per findAndModify () per sovrascrivere il problema di scrittura predefinito mentre, a partire da MongoDB 2.6, è ansible specificare un problema di scrittura per il metodo update ().

Quando si modifica un singolo documento, findAndModify () e il metodo update () aggiornano atomicamente il documento.

Una class utile di casi d’uso sono i contatori e casi simili. Ad esempio, dai un’occhiata a questo codice (uno dei test di MongoDB): find_and_modify4.js .

Pertanto, con findAndModify si incrementa il contatore e si ottiene il relativo valore incrementato in un unico passaggio. Confronta: se tu (A) esegui questa operazione in due passaggi e qualcun altro (B) esegue la stessa operazione tra i tuoi passi, allora A e B potrebbero ottenere lo stesso ultimo valore contatore invece di due diversi (solo un esempio di possibili problemi).