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.