När du använder metoder som find() eller findOne() i MongoDB får du som standard hela dokumentet tillbaka. Och om du använder projektioner kan du returnera specifika nyckel-/värdepar.
Men vad händer om du bara vill ha värdet?
Du kan extrahera värdet på ett fält genom att lägga till det fältets namn till din fråga när du använder findOne() .
Exempel
Anta att vi har en samling som heter products med följande dokument:
{ "_id" :1, "product" :"Bat", "sizes" :[ "S", "M", "L" ] }{ "_id" :2, "product" :"Hatt" , "sizes" :[ "S", "L", "XL" ] }{ "_id" :3, "product" :"Cap", "sizes" :[ "M", "L" ] }
Om vi ville returnera det första dokumentets produkt kan vi göra följande:
db.products.findOne().product
Resultat:
Bat
Observera att vi använde findOne() metod. Den här tekniken fungerar inte på find() metod. findOne() metod returnerar ett enda dokument, medan find() metoden returnerar bara en markör till dokumentet.
Om vi ville returnera arrayen kunde vi göra detta:
db.products.findOne().sizes
Resultat:
[ "S", "M", "L" ]
Och vi kan få ett matrisvärde genom att referera till dess index:
db.products.findOne().sizes[0]
Resultat:
S
Arrayer är nollbaserade, och så 0 refererar till det första elementet i arrayen, 1 refererar till det andra elementet, 2 den tredje och så vidare.
Specifikt dokument
Som standard är findOne() metod returnerar det första dokumentet i samlingen. Vi kan välja ett annat dokument genom att ange att skicka en fråga som första argument.
Jag säger "första argumentet" eftersom findOne() accepterar även en projection argument som ett valfritt andra argument.
db.products.findOne({_id: 2}, {sizes: 1, _id: 0}).sizes
Resultat:
[ "S", "L", "XL" ]
I det här fallet lade jag till ett projektionsargument, men det hade ingen effekt på resultatet. Men det skulle ha haft en effekt om jag hade angett ett värde på 0. Det skulle ha resulterat i att ingenting returnerades.
Inbäddade dokument
Du kan använda punktnotation för att returnera värden från inbäddade dokument
Exempeldokument:
{ "_id" :1, "name" :"Wag", "details" :{ "type" :"Hund", "weight" :20 }}
Vi kan göra följande för att returnera ett värde från det inbäddade dokumentet:
db.pets.findOne().details.type
Resultat:
Hund