Wenn Sie eine Sammlung in MongoDB abfragen, sind Sie manchmal mit den Feldnamen nicht zufrieden. Standardmäßig spiegeln die Feldnamen einfach die Feldnamen in den tatsächlichen Dokumenten wider.
Vielleicht sind die Feldnamen inkonsistent oder es liegt ein Tippfehler vor. Was auch immer der Grund sein mag, Sie können das $project
verwenden Aggregation-Pipeline-Phase, um ein Feld in Ihren Abfrageergebnissen umzubenennen.
In gewisser Weise ist dies mit der Verwendung eines Alias in SQL vergleichbar, da die zugrunde liegenden Felder nicht umbenannt werden, sondern sie einfach in den Abfrageergebnissen umbenannt werden.
Beispiel
Angenommen, wir geben den Inhalt einer Sammlung wie folgt zurück:
db.employees.find()
Ergebnis:
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 4, "name" : "Chris", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 }
Hier verwenden wir find()
-Methode, um den Inhalt der Sammlung zurückzugeben.
In diesem Fall werden die Namen der einzelnen Felder in den Ergebnissen zurückgegeben.
Aber was wäre, wenn wir wollten, dass die Feldnamen anders sind? Was ist zum Beispiel, wenn wir name
ersetzen möchten mit employee
?
In diesem Fall könnten wir aggregate()
verwenden Methode, um eine Abfrage wie diese auszuführen:
db.employees.aggregate([
{ "$project": { "employee": "$name", "salary": 1 }}
])
Ergebnis:
{ "_id" : 2, "salary" : 128000, "employee" : "Sarah" } { "_id" : 3, "salary" : 25000, "employee" : "Fritz" } { "_id" : 4, "salary" : 45000, "employee" : "Chris" } { "_id" : 5, "salary" : 82000, "employee" : "Beck" }
Beachten Sie, dass MongoDB die Felder in der Reihenfolge des Einfügens anzeigt, was zum salary
führt Feld, das vor dem employee
präsentiert wird Feld. Wenn das nicht akzeptabel ist, können wir die Abfrage jederzeit wie folgt ändern:
db.employees.aggregate([
{ "$project": { "employee": "$name", "salary": "$salary" }}
])
Ergebnis:
{ "_id" : 2, "employee" : "Sarah", "salary" : 128000 } { "_id" : 3, "employee" : "Fritz", "salary" : 25000 } { "_id" : 4, "employee" : "Chris", "salary" : 45000 } { "_id" : 5, "employee" : "Beck", "salary" : 82000 }
Felder in eingebetteten Dokumenten umbenennen
Sie können die gleiche Methode verwenden, um Felder in eingebetteten Dokumenten umzubenennen. Verwenden Sie in diesem Fall die Punktnotation, um auf das Feld zu verweisen, das Sie umbenennen möchten.
Angenommen, wir führen die folgende Abfrage für pets
aus Sammlung:
db.pets.find().pretty()
Ergebnis:
{ "_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") } }
Wir können Felder in den eingebetteten Dokumenten wie folgt umbenennen:
db.pets.aggregate([
{ "$project":
{
"_id": 0,
"Pet": "$name",
"Type": "$details.type",
"Born": "$details.born"
}
}
])
Ergebnis:
{ "Pet" : "Wag", "Type" : "Dog" } { "Pet" : "Fetch", "Born" : ISODate("2020-06-22T14:00:00Z") } { "Pet" : "Scratch", "Type" : "Cat", "Born" : ISODate("2020-12-19T14:00:00Z") }
In diesem Fall habe ich nicht alle Felder in den eingebetteten Dokumenten ausgewählt, aber Sie verstehen schon.
Ich habe auch "_id": 0
verwendet um die _id
wegzulassen Feld.
Beachten Sie auch, dass, wenn ein Dokument tatsächlich kein Feld hat, das in $project
angegeben ist Phase, dann wird es im resultierenden Dokument einfach weggelassen. Sie können dies im ersten Dokument sehen, das den Born
weglässt Feld und das zweite Dokument, das den Type
weglässt Feld.