MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Mongoose znajdź/zaktualizuj poddokument

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.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak używać $regex w zapytaniu agregującym mongodb w $match

  2. Jak powiedzieć Mongo, aby posortował kolekcję przed ograniczeniem wyników?

  3. Wyświetlanie ostatniej wiadomości z każdej rozmowy z udziałem użytkownika w MongoDB

  4. MongoDB Ruby Driver 2.5.x Problemy z rozróżnianiem wielkości liter w nazwach hostów w zestawach replik

  5. mongodb php - jak wykonać zapytanie typu INNER JOIN