Někdy při dotazu na kolekci v MongoDB nemusíte být spokojeni s názvy polí. Ve výchozím nastavení jsou názvy polí jednoduše odrazem názvů polí ve skutečných dokumentech.
Možná jsou názvy polí nekonzistentní nebo je tam překlep. Ať už je důvod jakýkoli, můžete použít $project
fázi agregačního kanálu k přejmenování pole ve výsledcích dotazu.
V některých ohledech je to srovnatelné s použitím aliasu v SQL, protože nepřejmenovává základní pole, ale pouze je přejmenovává ve výsledcích dotazu.
Příklad
Předpokládejme, že vrátíme obsah kolekce takto:
db.employees.find()
Výsledek:
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 4, "name" : "Chris", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 }
Zde používáme find()
způsob vrácení obsahu sbírky.
V tomto případě jsou ve výsledcích vrácena jména každého pole.
Ale co kdybychom chtěli, aby se názvy polí lišily? Co když například chceme nahradit name
s employee
?
V tom případě bychom mohli použít aggregate()
metoda k provedení dotazu, jako je tento:
db.employees.aggregate([
{ "$project": { "employee": "$name", "salary": 1 }}
])
Výsledek:
{ "_id" : 2, "salary" : 128000, "employee" : "Sarah" } { "_id" : 3, "salary" : 25000, "employee" : "Fritz" } { "_id" : 4, "salary" : 45000, "employee" : "Chris" } { "_id" : 5, "salary" : 82000, "employee" : "Beck" }
Všimněte si, že MongoDB zobrazuje pole v pořadí vložení, což vede k salary
pole prezentované před employee
pole. Pokud je to nepřijatelné, můžeme dotaz kdykoli změnit na toto:
db.employees.aggregate([
{ "$project": { "employee": "$name", "salary": "$salary" }}
])
Výsledek:
{ "_id" : 2, "employee" : "Sarah", "salary" : 128000 } { "_id" : 3, "employee" : "Fritz", "salary" : 25000 } { "_id" : 4, "employee" : "Chris", "salary" : 45000 } { "_id" : 5, "employee" : "Beck", "salary" : 82000 }
Přejmenovat pole ve vložených dokumentech
Stejnou metodu můžete použít k přejmenování polí ve vložených dokumentech. V tomto případě použijte tečkovou notaci pro odkaz na pole, které chcete přejmenovat.
Předpokládejme, že spustíme následující dotaz proti pets
kolekce:
db.pets.find().pretty()
Výsledek:
{ "_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") } }
Pole ve vložených dokumentech můžeme přejmenovat takto:
db.pets.aggregate([
{ "$project":
{
"_id": 0,
"Pet": "$name",
"Type": "$details.type",
"Born": "$details.born"
}
}
])
Výsledek:
{ "Pet" : "Wag", "Type" : "Dog" } { "Pet" : "Fetch", "Born" : ISODate("2020-06-22T14:00:00Z") } { "Pet" : "Scratch", "Type" : "Cat", "Born" : ISODate("2020-12-19T14:00:00Z") }
V tomto případě jsem nevybral všechna pole ve vložených dokumentech, ale máte představu.
Také jsem použil "_id": 0
vynechat _id
pole.
Všimněte si také, že pokud dokument ve skutečnosti nemá pole, které je specifikováno v $project
fázi, pak bude ve výsledném dokumentu jednoduše vynechán. Můžete to vidět v prvním dokumentu, který vynechává Born
pole a druhý dokument, který vynechává Type
pole.