Ibland när du frågar efter en samling i MongoDB kanske du inte är nöjd med fältnamnen. Som standard är fältnamnen helt enkelt en reflektion av fältnamnen i de faktiska dokumenten.
Kanske är fältnamnen inkonsekventa, eller så finns det ett stavfel. Oavsett anledning kan du använda $project
aggregeringspipeline för att byta namn på ett fält i dina frågeresultat.
På vissa sätt är detta jämförbart med att använda ett alias i SQL, eftersom det inte byter namn på de underliggande fälten, utan bara byter namn på dem i frågeresultaten.
Exempel
Anta att vi returnerar innehållet i en samling så här:
db.employees.find()
Resultat:
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 4, "name" : "Chris", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 }
Här använder vi find()
metod för att returnera innehållet i samlingen.
I det här fallet returneras namnen på varje fält i resultaten.
Men tänk om vi ville att fältnamnen skulle vara annorlunda? Till exempel, vad händer om vi vill ersätta name
med anställd
?
I så fall kan vi använda aggregate()
metod för att utföra en fråga som denna:
db.employees.aggregate([
{ "$project": { "employee": "$name", "salary": 1 }}
])
Resultat:
{ "_id" : 2, "salary" : 128000, "employee" : "Sarah" } { "_id" : 3, "salary" : 25000, "employee" : "Fritz" } { "_id" : 4, "salary" : 45000, "employee" : "Chris" } { "_id" : 5, "salary" : 82000, "employee" : "Beck" }
Observera att MongoDB visar fälten i infogningsordning, vilket resulterar i lön
fältet visas före anställd
fält. Om det är oacceptabelt kan vi alltid ändra frågan till detta:
db.employees.aggregate([
{ "$project": { "employee": "$name", "salary": "$salary" }}
])
Resultat:
{ "_id" : 2, "employee" : "Sarah", "salary" : 128000 } { "_id" : 3, "employee" : "Fritz", "salary" : 25000 } { "_id" : 4, "employee" : "Chris", "salary" : 45000 } { "_id" : 5, "employee" : "Beck", "salary" : 82000 }
Byt namn på fält i inbäddade dokument
Du kan använda samma metod för att byta namn på fält i inbäddade dokument. I det här fallet, använd punktnotation för att referera till fältet som du vill byta namn på.
Anta att vi kör följande fråga mot ett husdjur
samling:
db.pets.find().pretty()
Resultat:
{ "_id" : 1, "name" : "Wag", "details" : { "type" : "Dog", "weight" : 20, "awards" : { "Florida Dog Awards" : "Top Dog", "New York Marathon" : "Fastest Dog", "Sumo 2020" : "Biggest Dog" } } } { "_id" : 2, "name" : "Fetch", "details" : { "born" : ISODate("2020-06-22T14:00:00Z"), "color" : "Black" } } { "_id" : 3, "name" : "Scratch", "details" : { "eats" : [ "Mouse Porridge", "Bird Soup", "Caviar" ], "type" : "Cat", "born" : ISODate("2020-12-19T14:00:00Z") } }
Vi kan byta namn på fält på de inbäddade dokumenten så här:
db.pets.aggregate([
{ "$project":
{
"_id": 0,
"Pet": "$name",
"Type": "$details.type",
"Born": "$details.born"
}
}
])
Resultat:
{ "Pet" : "Wag", "Type" : "Dog" } { "Pet" : "Fetch", "Born" : ISODate("2020-06-22T14:00:00Z") } { "Pet" : "Scratch", "Type" : "Cat", "Born" : ISODate("2020-12-19T14:00:00Z") }
I det här fallet valde jag inte alla fält i de inbäddade dokumenten, men du fattar.
Jag använde också "_id":0
för att utelämna _id
fältet.
Observera också att om ett dokument faktiskt inte har ett fält som är specificerat i $project
steg, så kommer det helt enkelt att utelämnas i det resulterande dokumentet. Du kan se detta i det första dokumentet, som utelämnar Typ
fältet.