Às vezes, quando você consulta uma coleção no MongoDB, pode não ficar satisfeito com os nomes dos campos. Por padrão, os nomes dos campos são simplesmente um reflexo dos nomes dos campos nos documentos reais.
Talvez os nomes dos campos sejam inconsistentes ou haja um erro de digitação. Seja qual for o motivo, você pode usar o
$project
estágio do pipeline de agregação para renomear um campo nos resultados da consulta. De certa forma, isso é comparável ao uso de um alias no SQL, pois ele não renomeia os campos subjacentes, simplesmente os renomeia nos resultados da consulta.
Exemplo
Suponha que retornemos o conteúdo de uma coleção como esta:
db.employees.find()
Resultado:
{ "_id" : 2, "name" : "Sarah", "salary" : 128000 } { "_id" : 3, "name" : "Fritz", "salary" : 25000 } { "_id" : 4, "name" : "Chris", "salary" : 45000 } { "_id" : 5, "name" : "Beck", "salary" : 82000 }
Aqui, usamos o
find()
método para retornar o conteúdo da coleção. Nesse caso, os nomes de cada campo são retornados nos resultados.
Mas e se quiséssemos que os nomes dos campos fossem diferentes? Por exemplo, e se quisermos substituir
name
com employee
? Nesse caso, poderíamos usar o
aggregate()
método para realizar uma consulta como esta:db.employees.aggregate([
{ "$project": { "employee": "$name", "salary": 1 }}
])
Resultado:
{ "_id" : 2, "salary" : 128000, "employee" : "Sarah" } { "_id" : 3, "salary" : 25000, "employee" : "Fritz" } { "_id" : 4, "salary" : 45000, "employee" : "Chris" } { "_id" : 5, "salary" : 82000, "employee" : "Beck" }
Observe que o MongoDB exibe os campos na ordem de inserção, o que resulta no
salary
campo sendo apresentado antes do employee
campo. Se isso for inaceitável, sempre podemos alterar a consulta para isso:db.employees.aggregate([
{ "$project": { "employee": "$name", "salary": "$salary" }}
])
Resultado:
{ "_id" : 2, "employee" : "Sarah", "salary" : 128000 } { "_id" : 3, "employee" : "Fritz", "salary" : 25000 } { "_id" : 4, "employee" : "Chris", "salary" : 45000 } { "_id" : 5, "employee" : "Beck", "salary" : 82000 }
Renomear campos em documentos incorporados
Você pode usar o mesmo método para renomear campos em documentos incorporados. Nesse caso, use notação de ponto para se referir ao campo que deseja renomear.
Suponha que executemos a seguinte consulta em um
pets
coleção:db.pets.find().pretty()
Resultado:
{ "_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") } }
Podemos renomear campos nos documentos incorporados assim:
db.pets.aggregate([
{ "$project":
{
"_id": 0,
"Pet": "$name",
"Type": "$details.type",
"Born": "$details.born"
}
}
])
Resultado:
{ "Pet" : "Wag", "Type" : "Dog" } { "Pet" : "Fetch", "Born" : ISODate("2020-06-22T14:00:00Z") } { "Pet" : "Scratch", "Type" : "Cat", "Born" : ISODate("2020-12-19T14:00:00Z") }
Nesse caso, não selecionei todos os campos nos documentos incorporados, mas você entendeu.
Eu também usei
"_id": 0
para omitir o _id
campo. Observe também que, se um documento não tiver um campo especificado no
$project
estágio, então ele será simplesmente omitido no documento resultante. Você pode ver isso no primeiro documento, que omite o Born
campo e o segundo documento, que omite o Type
campo.