MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Benennen Sie ein Feld in den Abfrageergebnissen in MongoDB um

Wenn Sie eine Sammlung in MongoDB abfragen, sind Sie manchmal mit den Feldnamen nicht zufrieden. Standardmäßig spiegeln die Feldnamen einfach die Feldnamen in den tatsächlichen Dokumenten wider.

Vielleicht sind die Feldnamen inkonsistent oder es liegt ein Tippfehler vor. Was auch immer der Grund sein mag, Sie können das $project verwenden Aggregation-Pipeline-Phase, um ein Feld in Ihren Abfrageergebnissen umzubenennen.

In gewisser Weise ist dies mit der Verwendung eines Alias ​​in SQL vergleichbar, da die zugrunde liegenden Felder nicht umbenannt werden, sondern sie einfach in den Abfrageergebnissen umbenannt werden.

Beispiel

Angenommen, wir geben den Inhalt einer Sammlung wie folgt zurück:

db.employees.find()

Ergebnis:

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

Hier verwenden wir find() -Methode, um den Inhalt der Sammlung zurückzugeben.

In diesem Fall werden die Namen der einzelnen Felder in den Ergebnissen zurückgegeben.

Aber was wäre, wenn wir wollten, dass die Feldnamen anders sind? Was ist zum Beispiel, wenn wir name ersetzen möchten mit employee ?

In diesem Fall könnten wir aggregate() verwenden Methode, um eine Abfrage wie diese auszuführen:

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

Ergebnis:

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

Beachten Sie, dass MongoDB die Felder in der Reihenfolge des Einfügens anzeigt, was zum salary führt Feld, das vor dem employee präsentiert wird Feld. Wenn das nicht akzeptabel ist, können wir die Abfrage jederzeit wie folgt ändern:

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

Ergebnis:

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

Felder in eingebetteten Dokumenten umbenennen

Sie können die gleiche Methode verwenden, um Felder in eingebetteten Dokumenten umzubenennen. Verwenden Sie in diesem Fall die Punktnotation, um auf das Feld zu verweisen, das Sie umbenennen möchten.

Angenommen, wir führen die folgende Abfrage für pets aus Sammlung:

db.pets.find().pretty()

Ergebnis:

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

Wir können Felder in den eingebetteten Dokumenten wie folgt umbenennen:

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

Ergebnis:

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

In diesem Fall habe ich nicht alle Felder in den eingebetteten Dokumenten ausgewählt, aber Sie verstehen schon.

Ich habe auch "_id": 0 verwendet um die _id wegzulassen Feld.

Beachten Sie auch, dass, wenn ein Dokument tatsächlich kein Feld hat, das in $project angegeben ist Phase, dann wird es im resultierenden Dokument einfach weggelassen. Sie können dies im ersten Dokument sehen, das den Born weglässt Feld und das zweite Dokument, das den Type weglässt Feld.