Czasami, gdy wysyłasz zapytanie do kolekcji w MongoDB, możesz nie być zadowolony z nazw pól. Domyślnie nazwy pól są po prostu odzwierciedleniem nazw pól w rzeczywistych dokumentach.
Być może nazwy pól są niespójne lub jest literówka. Niezależnie od powodu, możesz użyć $project
etap potoku agregacji, aby zmienić nazwę pola w wynikach zapytania.
Pod pewnymi względami jest to porównywalne z używaniem aliasu w SQL, ponieważ nie zmienia on nazw bazowych pól, po prostu zmienia ich nazwy w wynikach zapytania.
Przykład
Załóżmy, że zwracamy zawartość kolekcji w następujący sposób:
db.employees.find()
Wynik:
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 4, "name" : "Chris", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 }
Tutaj używamy find()
metoda, aby zwrócić zawartość kolekcji.
W takim przypadku w wynikach zwracane są nazwy każdego pola.
Ale co, jeśli chcielibyśmy, aby nazwy pól były inne? Na przykład, co jeśli chcemy zastąpić name
z employee
?
W takim przypadku moglibyśmy użyć aggregate()
metoda do wykonania zapytania w ten sposób:
db.employees.aggregate([
{ "$project": { "employee": "$name", "salary": 1 }}
])
Wynik:
{ "_id" : 2, "salary" : 128000, "employee" : "Sarah" } { "_id" : 3, "salary" : 25000, "employee" : "Fritz" } { "_id" : 4, "salary" : 45000, "employee" : "Chris" } { "_id" : 5, "salary" : 82000, "employee" : "Beck" }
Zauważ, że MongoDB wyświetla pola w kolejności wstawiania, co skutkuje salary
pole prezentowane przed employee
pole. Jeśli jest to niedopuszczalne, zawsze możemy zmienić zapytanie na to:
db.employees.aggregate([
{ "$project": { "employee": "$name", "salary": "$salary" }}
])
Wynik:
{ "_id" : 2, "employee" : "Sarah", "salary" : 128000 } { "_id" : 3, "employee" : "Fritz", "salary" : 25000 } { "_id" : 4, "employee" : "Chris", "salary" : 45000 } { "_id" : 5, "employee" : "Beck", "salary" : 82000 }
Zmień nazwy pól w osadzonych dokumentach
W ten sam sposób możesz zmienić nazwy pól w osadzonych dokumentach. W takim przypadku użyj notacji kropkowej, aby odnieść się do pola, którego nazwę chcesz zmienić.
Załóżmy, że uruchamiamy następujące zapytanie wobec pets
kolekcja:
db.pets.find().pretty()
Wynik:
{ "_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") } }
Możemy zmienić nazwy pól w osadzonych dokumentach w ten sposób:
db.pets.aggregate([
{ "$project":
{
"_id": 0,
"Pet": "$name",
"Type": "$details.type",
"Born": "$details.born"
}
}
])
Wynik:
{ "Pet" : "Wag", "Type" : "Dog" } { "Pet" : "Fetch", "Born" : ISODate("2020-06-22T14:00:00Z") } { "Pet" : "Scratch", "Type" : "Cat", "Born" : ISODate("2020-12-19T14:00:00Z") }
W tym przypadku nie zaznaczyłem wszystkich pól w osadzonych dokumentach, ale masz pomysł.
Użyłem również "_id": 0
aby pominąć _id
pole.
Zwróć też uwagę, że jeśli dokument w rzeczywistości nie ma pola określonego w $project
etap, to zostanie po prostu pominięty w wynikowym dokumencie. Możesz to zobaczyć w pierwszym dokumencie, który pomija Born
pole i drugi dokument, w którym pominięto Type
pole.