MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Renomeie um campo nos resultados da consulta no MongoDB


À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.