Quindi, come puoi notare, l'impostazione predefinita in mongoose è che quando "incorpori" i dati in un array come questo ottieni un _id
valore per ciascuna voce di matrice come parte delle proprie proprietà del documento secondario. Puoi effettivamente utilizzare questo valore per determinare l'indice dell'articolo che intendi aggiornare. Il modo MongoDB per farlo è il $
posizionale variabile dell'operatore, che contiene la posizione "corrispondente" nell'array:
Folder.findOneAndUpdate(
{ "_id": folderId, "permissions._id": permission._id },
{
"$set": {
"permissions.$": permission
}
},
function(err,doc) {
}
);
Quel .findOneAndUpdate()
restituirà il documento modificato o altrimenti puoi semplicemente usare .update()
come metodo se non è necessario restituire il documento. Le parti principali sono la "corrispondenza" dell'elemento dell'array da aggiornare e l'"identificazione" della corrispondenza con il $
posizionale come accennato in precedenza.
Allora ovviamente stai usando il $set
operatore in modo che solo gli elementi specificati vengono effettivamente inviati "via cavo" al server. Puoi andare oltre con la "notazione del punto" e specificare semplicemente gli elementi che desideri effettivamente aggiornare. Come in:
Folder.findOneAndUpdate(
{ "_id": folderId, "permissions._id": permission._id },
{
"$set": {
"permissions.$.role": permission.role
}
},
function(err,doc) {
}
);
Quindi questa è la flessibilità fornita da MongoDB, in cui puoi essere molto "mirato" nel modo in cui aggiorni effettivamente un documento.
Ciò che fa, tuttavia, è "bypassare" qualsiasi logica che potresti aver incorporato nel tuo schema "mangusta", come "convalida" o altri "hook pre-salvataggio". Questo perché il modo "ottimale" è una "funzione" di MongoDB e come è progettato. La stessa Mongoose cerca di essere un involucro di "comodità" su questa logica. Ma se sei pronto a prendere il controllo da solo, gli aggiornamenti possono essere effettuati nel modo più ottimale.
Quindi, ove possibile, mantieni i tuoi dati "incorporati" e non utilizzare modelli di riferimento. Consente l'aggiornamento atomico di entrambi gli elementi "genitore" e "figlio" in aggiornamenti semplici in cui non è necessario preoccuparsi della concorrenza. Probabilmente è uno dei motivi per cui dovresti aver selezionato MongoDB in primo luogo.