Podstawy MongoDB – Modyfikowanie i usuwanie rekordów w terminalu mongo.

W ostatnim wpisie pokazałem jak zainstalować mongo, jak je uruchomić i jak stworzyć pierwszą bazę danych. Oprócz tego przedstawiłem dwie proste komendy, pozwalające na dodawanie rekordów do bazy oraz na wyświetlanie zawartości bazy.

Dziś pokażę jak wyszukiwać konkretne elementy w bazie danych i jak je aktualizować o nowe wartości. Do tego, na koniec zaprezentuję jak usuwać rekordy z bazy.

JavaScript Noob MongoDB

W dzisiejszych przykładach używać będę tej samej bazy co ostatnio czyli example_database. Po uruchomieniu terminalu mongo przełączam się na example_database taką komendą:

Najpierw chcę dodać do niej trochę danych. Będą to proste obiekty zawierające jedno pole, imię psa. Użyję tablicy z imionami oraz prostej pętli for. Do terminala przesyłam następujące komendy:

Następnie sprawdzam jak wygląda zawartość bazy korzystając z metody find:

Oto wynik:

mongopsy

Ponieważ poprzedni razem do example_database dodałem już rekordy, których pola name równe są maja i miluś, teraz występują one w bazie podwójnie. Jednak są to osobne rekordy, co możemy zobaczyć po wartości ich pól id.

Pola id dodawane są przez mongo automatycznie i ich wartości są zawsze unikatowe dla każdego rekordu.

Ok, ale powiedzmy, że chciałbym wyświetlić tylko te rekordy, których pola name równe są maja.

Mogę to zrobić korzystając także z metody find. Tym razem jednak w jej argumencie, przekazać muszę obiekt o polach i wartościach, równych tym, które posiada szukany przez nas rekord. Oto przykład:

To polecenie spowoduje, że zwrócona zostanie kolekcja rekordów składająca się tylko z elementów, które zawierają pole name równe maja. W przypadku mojej bazy danych będą to dwa rekordy:

majaDB

Super, wszystko się zgadza. Powiedzmy jednak, że chcę aby moja baza zawierała dwa rekordy o wartości maja reprezentujące dwa różne psy, jeden o wieku 3 a drugi o wieku 5 lat. Muszę zaktualizować istniejące rekordy tak aby zawierały te dane. W tym celu użyję metody update, którą mogę wywołać na kolekcji. Oto przykład:

Metoda update otrzymuje dwa argumenty, oba to obiekty. Pierwszy z nich zawiera informacje o tym jaki element ma zostać zmieniony. Tak jak w przypadku metody find, na cel brany będzie taki rekord, którego pola i wartości pasują do tych podanych w pierwszym argumencie. Drugi argument to dane, które mają zostać dodane do rekordu. Ważne jest to, że całość jest wartością pola $set obiektu owijającego. Użycie tej składni sprawia, że dane są „doklejane” do obiektu.

Teraz rekord o id 58c03a64d875ac42c05e47bc wygląda tak:

Gdybym pominął ominął wspomniany wyżej owijający obiekt z polem $set i wpisał komendę w ten sposób:

Teraz rekord o id 58c03a64d875ac42c05e47bc zostałby zastąpiony wartościami wpisanymi w obiekcie w drugim argumencie. Oczywiście czasem będziemy chcieli osiągnąć taki wynik.

Teraz kiedy wiek jednego z psów o imieniu maja został ustawiony w bazie example_database, mogę zmodyfikować moje wywołanie find, tak aby zwracał tylko ten konkretny rekord. Wygląda ono tak:

Baza zwróci wtedy tylko jeden rekord. W obiekcie przekazywanym do find, mogę dopisywać więcej pól i w ten sposób zawężać szukanie. To samo mogę zrobić w pierwszym argumencie metody update, oraz w metodzie remove, którą chciałbym teraz opisać.

Jak łatwo się domyślić, służy ona do usuwania rekordów. Powiedzmy, że błędnie wpisałem wiek psa i chciałbym usunąć to konkretne pole, tak wygląda odpowiednia komenda:

Po wywołaniu tej komendy, sprawdzam zawartość bazy find-em. oto wynik:

mongobezpsa

Nie muszę chyba mówić, że podczas używania remove, należy zachować wyjątkową ostrożność. Gdybym na przykład w powyższym przykładzie, wewnątrz argumentu nie podał pola age a jedynie samo name, usunięte by zostały wszystkie rekordy zawierające pole name równe maja. W tym wypadku byłyby to dwa pola.

Na dziś jednak to tyle :). Jeżeli chcesz być na bieżąco z postami na blogu zachęcam do polubienia mojej strony na facebooku. Zawsze zamieszczam tam informacje o wszystkich nowościach. Jest to też dobre miejsce na kontakt ze mną. Na wszystkie pytania zawsze odpowiem 🙂 .

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *