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:
BatObservera att vi använde
findOne()
metod. Den här tekniken fungerar inte påfind()
metod.findOne()
metod returnerar ett enda dokument, medanfind()
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:
SArrayer ä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 enprojection
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