sql >> Base de Datos >  >> NoSQL >> MongoDB

Cambiar el nombre de un campo en los resultados de la consulta en MongoDB

A veces, cuando consulta una colección en MongoDB, es posible que no esté satisfecho con los nombres de los campos. De forma predeterminada, los nombres de campo son simplemente un reflejo de los nombres de campo en los documentos reales.

Quizás los nombres de los campos son inconsistentes o hay un error tipográfico. Sea cual sea el motivo, puedes usar el $project etapa de canalización de agregación para cambiar el nombre de un campo en los resultados de su consulta.

De alguna manera, esto es comparable al uso de un alias en SQL, ya que no cambia el nombre de los campos subyacentes, simplemente los cambia en los resultados de la consulta.

Ejemplo

Supongamos que devolvemos el contenido de una colección 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 }

Aquí, usamos find() método para devolver el contenido de la colección.

En este caso, los nombres de cada campo se devuelven en los resultados.

Pero, ¿y si quisiéramos que los nombres de los campos fueran diferentes? Por ejemplo, ¿qué pasa si queremos reemplazar name con employee ?

En ese caso, podríamos usar aggregate() método para realizar una 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" }

Tenga en cuenta que MongoDB muestra los campos en el orden de inserción, lo que da como resultado el salary campo que se presenta ante el employee campo. Si eso es inaceptable, siempre podemos cambiar la consulta a esto:

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 }

Renombrar campos en documentos incrustados

Puede usar el mismo método para cambiar el nombre de los campos en documentos incrustados. En este caso, utilice la notación de puntos para hacer referencia al campo que desea cambiar de nombre.

Supongamos que ejecutamos la siguiente consulta contra un pets colección:

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 cambiar el nombre de los campos en los documentos incrustados de esta manera:

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") }

En este caso, no seleccioné todos los campos en los documentos incrustados, pero se entiende la idea.

También usé "_id": 0 para omitir el _id campo.

También tenga en cuenta que si un documento en realidad no tiene un campo que se especifica en el $project etapa, simplemente se omitirá en el documento resultante. Puede ver esto en el primer documento, que omite el Born y el segundo documento, que omite el Type campo.