Jak zauważyłeś, domyślną wartością w manguście jest to, że kiedy „osadzisz” dane w takiej tablicy, otrzymasz _id
wartość dla każdego wpisu tablicy jako część jego własnych właściwości dokumentu podrzędnego. Możesz użyć tej wartości w celu określenia indeksu elementu, który zamierzasz zaktualizować. Sposobem MongoDB na zrobienie tego jest pozycyjny $
zmienna operatora, która przechowuje „dopasowaną” pozycję w tablicy:
Folder.findOneAndUpdate(
{ "_id": folderId, "permissions._id": permission._id },
{
"$set": {
"permissions.$": permission
}
},
function(err,doc) {
}
);
Ten .findOneAndUpdate()
metoda zwróci zmodyfikowany dokument lub w przeciwnym razie możesz po prostu użyć .update()
jako metoda, jeśli nie potrzebujesz zwracanego dokumentu. Główne części to „dopasowywanie” elementu tablicy do aktualizacji i „identyfikowanie”, które pasują do pozycyjnego $
jak wspomniano wcześniej.
Wtedy oczywiście używasz $set
operatora, aby tylko elementy, które określisz, są w rzeczywistości wysyłane „przez przewód” na serwer. Możesz pójść dalej za pomocą „notacji kropkowej” i po prostu określić elementy, które faktycznie chcesz zaktualizować. Jak w:
Folder.findOneAndUpdate(
{ "_id": folderId, "permissions._id": permission._id },
{
"$set": {
"permissions.$.role": permission.role
}
},
function(err,doc) {
}
);
Jest to więc elastyczność, którą zapewnia MongoDB, dzięki której możesz być bardzo „ukierunkowany” na to, jak faktycznie aktualizujesz dokument.
To co jednak robi, to "omijanie" jakiejkolwiek logiki, którą mogłeś wbudować w swój schemat "mongusty", na przykład "walidacja" lub inne "haki przed zapisem". Dzieje się tak, ponieważ „optymalnym” sposobem jest „funkcja” MongoDB i sposób jej projektowania. Sam Mongoose stara się być „wygodnym” opakowaniem tej logiki. Ale jeśli jesteś przygotowany do samodzielnego przejęcia kontroli, aktualizacje mogą być dokonywane w najbardziej optymalny sposób.
Jeśli to możliwe, zachowaj „osadzone” dane i nie używaj modeli referencyjnych. Pozwala na atomową aktualizację elementów „nadrzędnych” i „podrzędnych” w prostych aktualizacjach, w których nie musisz martwić się o współbieżność. Prawdopodobnie jest to jeden z powodów, dla których powinieneś wybrać MongoDB w pierwszej kolejności.