Nogle gange, når du forespørger på en samling i MongoDB, er du måske ikke tilfreds med feltnavnene. Som standard er feltnavnene blot en afspejling af feltnavnene i de faktiske dokumenter.
Måske er feltnavnene inkonsistente, eller der er en tastefejl. Uanset årsagen kan du bruge $project
aggregeringspipelinestadiet for at omdøbe et felt i dine forespørgselsresultater.
På nogle måder kan dette sammenlignes med at bruge et alias i SQL, da det ikke omdøber de underliggende felter, det omdøber dem blot i forespørgselsresultaterne.
Eksempel
Antag, at vi returnerer indholdet af en samling som denne:
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 }
Her bruger vi find()
metode til at returnere indholdet af samlingen.
I dette tilfælde returneres navnene på hvert felt i resultaterne.
Men hvad nu hvis vi ville have feltnavnene til at være anderledes? For eksempel, hvad hvis vi vil erstatte navn
med medarbejder
?
I så fald kunne vi bruge aggregate()
metode til at udføre en forespørgsel som denne:
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" }
Bemærk, at MongoDB viser felterne i rækkefølgen af indsættelse, hvilket resulterer i løn
feltet præsenteres foran medarbejderen
Mark. Hvis det er uacceptabelt, kan vi altid ændre forespørgslen til dette:
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 }
Omdøb felter i indlejrede dokumenter
Du kan bruge samme metode til at omdøbe felter i indlejrede dokumenter. I dette tilfælde skal du bruge prik-notation til at henvise til det felt, du vil omdøbe.
Antag, at vi kører følgende forespørgsel mod et kæledyr
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 omdøbe felter på de indlejrede dokumenter som dette:
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 dette tilfælde valgte jeg ikke alle felter i de indlejrede dokumenter, men du forstår.
Jeg brugte også "_id":0
for at udelade _id
felt.
Bemærk også, at hvis et dokument faktisk ikke har et felt, der er angivet i $project
fase, så vil det blot blive udeladt i det resulterende dokument. Du kan se dette i det første dokument, som udelader Type
felt.