Kiedy używasz metod takich jak find()
lub findOne()
w MongoDB domyślnie zwracany jest cały dokument. A jeśli używasz prognoz, możesz zwrócić określone pary klucz/wartość.
Ale co, jeśli chcesz tylko wartości?
Możesz wyodrębnić wartość pola, dołączając nazwę tego pola do zapytania podczas używania findOne()
.
Przykład
Załóżmy, że mamy kolekcję o nazwie products
z następującymi dokumentami:
{ "_id" : 1, "product" : "Bat", "sizes" : [ "S", "M", "L" ] } { "_id" : 2, "product" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "product" : "Cap", "sizes" : [ "M", "L" ] }
Gdybyśmy chcieli zwrócić produkt z pierwszego dokumentu, moglibyśmy wykonać następujące czynności:
db.products.findOne().product
Wynik:
Bat
Zauważ, że użyliśmy findOne()
metoda. Ta technika nie działa na find()
metoda. findOne()
metoda zwraca pojedynczy dokument, podczas gdy find()
metoda jedynie zwraca kursor do dokumentu.
Gdybyśmy chcieli zwrócić tablicę, moglibyśmy to zrobić:
db.products.findOne().sizes
Wynik:
[ "S", "M", "L" ]
I możemy uzyskać wartość tablicy, odwołując się do jej indeksu:
db.products.findOne().sizes[0]
Wynik:
S
Tablice są liczone od zera, więc 0
odwołuje się do pierwszego elementu tablicy, 1
odwołuje się do drugiego elementu, 2
trzeci i tak dalej.
Konkretny dokument
Domyślnie findOne()
Metoda zwraca pierwszy dokument w kolekcji. Możemy wybrać inny dokument, określając przekazanie zapytania jako pierwszego argumentu.
Mówię „pierwszy argument”, ponieważ findOne()
akceptuje również projection
argument jako opcjonalny drugi argument.
db.products.findOne({_id: 2}, {sizes: 1, _id: 0}).sizes
Wynik:
[ "S", "L", "XL" ]
W tym przypadku dodałem argument projekcji, ale nie miało to wpływu na wynik. Ale miałoby to efekt, gdybym określił wartość 0. To by nie spowodowało zwrócenia niczego.
Osadzone dokumenty
Możesz użyć notacji kropkowej, aby zwrócić wartości z osadzonych dokumentów
Przykładowy dokument:
{ "_id" : 1, "name" : "Wag", "details" : { "type" : "Dog", "weight" : 20 } }
Aby zwrócić wartość z osadzonego dokumentu, moglibyśmy wykonać następujące czynności:
db.pets.findOne().details.type
Wynik:
Dog