MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Renommer un champ dans les résultats de la requête dans MongoDB

Parfois, lorsque vous interrogez une collection dans MongoDB, vous n'êtes peut-être pas satisfait des noms de champs. Par défaut, les noms de champ reflètent simplement les noms de champ dans les documents réels.

Peut-être que les noms de champs sont incohérents ou qu'il y a une faute de frappe. Quelle que soit la raison, vous pouvez utiliser le $project étape de pipeline d'agrégation pour renommer un champ dans les résultats de votre requête.

À certains égards, cela est comparable à l'utilisation d'un alias dans SQL, car il ne renomme pas les champs sous-jacents, il les renomme simplement dans les résultats de la requête.

Exemple

Supposons que nous retournions le contenu d'une collection comme celle-ci :

db.employees.find()

Résultat :

{ "_id" : 2, "name" : "Sarah", "salary" : 128000 }
{ "_id" : 3, "name" : "Fritz", "salary" : 25000 }
{ "_id" : 4, "name" : "Chris", "salary" : 45000 }
{ "_id" : 5, "name" : "Beck", "salary" : 82000 }

Ici, nous utilisons le find() méthode pour retourner le contenu de la collection.

Dans ce cas, les noms de chaque champ sont retournés dans les résultats.

Mais que se passe-t-il si nous voulons que les noms de champs soient différents ? Par exemple, que se passe-t-il si nous voulons remplacer name avec employee ?

Dans ce cas, nous pourrions utiliser le aggregate() méthode pour effectuer une requête comme celle-ci :

db.employees.aggregate([
  { "$project": { "employee": "$name", "salary": 1 }}
])

Résultat :

{ "_id" : 2, "salary" : 128000, "employee" : "Sarah" }
{ "_id" : 3, "salary" : 25000, "employee" : "Fritz" }
{ "_id" : 4, "salary" : 45000, "employee" : "Chris" }
{ "_id" : 5, "salary" : 82000, "employee" : "Beck" }

Notez que MongoDB affiche les champs dans l'ordre d'insertion, ce qui donne le salary champ présenté devant le employee domaine. Si cela n'est pas acceptable, nous pouvons toujours remplacer la requête par ceci :

db.employees.aggregate([
  { "$project": { "employee": "$name", "salary": "$salary" }}
])

Résultat :

{ "_id" : 2, "employee" : "Sarah", "salary" : 128000 }
{ "_id" : 3, "employee" : "Fritz", "salary" : 25000 }
{ "_id" : 4, "employee" : "Chris", "salary" : 45000 }
{ "_id" : 5, "employee" : "Beck", "salary" : 82000 }

Renommer les champs dans les documents intégrés

Vous pouvez utiliser la même méthode pour renommer les champs dans les documents incorporés. Dans ce cas, utilisez la notation pointée pour faire référence au champ que vous souhaitez renommer.

Supposons que nous lancions la requête suivante sur un pets collecte :

db.pets.find().pretty()

Résultat :

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

Nous pouvons renommer les champs des documents intégrés comme ceci :

db.pets.aggregate([
  { "$project": 
    { 
      "_id": 0,
      "Pet": "$name",
      "Type": "$details.type",
      "Born": "$details.born"
    }
  }
])

Résultat :

{ "Pet" : "Wag", "Type" : "Dog" }
{ "Pet" : "Fetch", "Born" : ISODate("2020-06-22T14:00:00Z") }
{ "Pet" : "Scratch", "Type" : "Cat", "Born" : ISODate("2020-12-19T14:00:00Z") }

Dans ce cas, je n'ai pas sélectionné tous les champs dans les documents intégrés, mais vous voyez l'idée.

J'ai aussi utilisé "_id": 0 pour omettre le _id champ.

Notez également que si un document n'a pas réellement de champ spécifié dans le $project stade, il sera simplement omis dans le document résultant. Vous pouvez le voir dans le premier document, qui omet le Born champ, et le deuxième document, qui omet le Type champ.