Понякога, когато правите заявка за колекция в MongoDB, може да не сте доволни от имената на полетата. По подразбиране имената на полетата са просто отражение на имената на полетата в действителните документи.
Може би имената на полетата са непоследователни или има печатна грешка. Каквато и да е причината, можете да използвате $project етап на тръбопровода за агрегиране, за да преименувате поле в резултатите от заявката си.
В някои отношения това е сравнимо с използването на псевдоним в SQL, тъй като не преименува основните полета, а просто ги преименува в резултатите от заявката.
Пример
Да предположим, че връщаме съдържанието на колекция по следния начин:
db.employees.find() Резултат:
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
{ "_id" : 4, "name" : "Chris", "salary" : 45000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 }
Тук използваме find() метод за връщане на съдържанието на колекцията.
В този случай имената на всяко поле се връщат в резултатите.
Но какво ще стане, ако искаме имената на полетата да са различни? Например, какво ще стане, ако искаме да заменим name с employee ?
В този случай бихме могли да използваме aggregate() метод за изпълнение на заявка като тази:
db.employees.aggregate([
{ "$project": { "employee": "$name", "salary": 1 }}
]) Резултат:
{ "_id" : 2, "salary" : 128000, "employee" : "Sarah" }
{ "_id" : 3, "salary" : 25000, "employee" : "Fritz" }
{ "_id" : 4, "salary" : 45000, "employee" : "Chris" }
{ "_id" : 5, "salary" : 82000, "employee" : "Beck" }
Имайте предвид, че MongoDB показва полетата в реда на вмъкване, което води до salary поле, което се представя пред employee поле. Ако това е неприемливо, винаги можем да променим заявката на това:
db.employees.aggregate([
{ "$project": { "employee": "$name", "salary": "$salary" }}
]) Резултат:
{ "_id" : 2, "employee" : "Sarah", "salary" : 128000 }
{ "_id" : 3, "employee" : "Fritz", "salary" : 25000 }
{ "_id" : 4, "employee" : "Chris", "salary" : 45000 }
{ "_id" : 5, "employee" : "Beck", "salary" : 82000 } Преименувайте полета във вградени документи
Можете да използвате същия метод за преименуване на полета във вградени документи. В този случай използвайте нотация с точка, за да се обърнете към полето, което искате да преименувате.
Да предположим, че изпълняваме следната заявка срещу pets колекция:
db.pets.find().pretty() Резултат:
{
"_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")
}
} Можем да преименуваме полета във вградените документи по следния начин:
db.pets.aggregate([
{ "$project":
{
"_id": 0,
"Pet": "$name",
"Type": "$details.type",
"Born": "$details.born"
}
}
]) Резултат:
{ "Pet" : "Wag", "Type" : "Dog" }
{ "Pet" : "Fetch", "Born" : ISODate("2020-06-22T14:00:00Z") }
{ "Pet" : "Scratch", "Type" : "Cat", "Born" : ISODate("2020-12-19T14:00:00Z") } В този случай не избрах всички полета във вградените документи, но разбирате идеята.
Използвах също "_id": 0 за да пропуснете _id поле.
Също така имайте предвид, че ако документът всъщност няма поле, което е посочено в $project етап, тогава той просто ще бъде пропуснат в получения документ. Можете да видите това в първия документ, който пропуска Born поле и втория документ, който пропуска Type поле.