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.
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ą:
1 |
use example_database |
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:
1 2 |
var dogs = ["maja","milus","dzeki","rambo","pan_pepuszek"] for (i=0;i<dogs.length;i++){db.dogs.insert({"name":dogs[i]})} |
Następnie sprawdzam jak wygląda zawartość bazy korzystając z metody find:
1 |
db.dogs.find() |
Oto wynik:
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:
1 |
db.dogs.find({name:"maja"}) |
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:
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:
1 |
db.dogs.update({"_id":ObjectId("58c03a64d875ac42c05e47bc")},{$set:{age:3}}) |
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:
1 |
{ "_id" : ObjectId("58c03a64d875ac42c05e47bc"), "name" : "maja", "age" : 3 } |
Gdybym pominął ominął wspomniany wyżej owijający obiekt z polem $set i wpisał komendę w ten sposób:
1 |
db.dogs.update({"_id":ObjectId("58c03a64d875ac42c05e47bc")},{age:3}) |
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:
1 |
db.dogs.find({name:"maja",age:3}) |
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:
1 |
db.dogs.remove({name:"maja",age:3}) |
Po wywołaniu tej komendy, sprawdzam zawartość bazy find-em. oto wynik:
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 🙂 .
jhjh