sql >> Databasteknik >  >> NoSQL >> MongoDB

Byt namn på ett fält i frågeresultaten i MongoDB

Ibland när du frågar efter en samling i MongoDB kanske du inte är nöjd med fältnamnen. Som standard är fältnamnen helt enkelt en reflektion av fältnamnen i de faktiska dokumenten.

Kanske är fältnamnen inkonsekventa, eller så finns det ett stavfel. Oavsett anledning kan du använda $project aggregeringspipeline för att byta namn på ett fält i dina frågeresultat.

På vissa sätt är detta jämförbart med att använda ett alias i SQL, eftersom det inte byter namn på de underliggande fälten, utan bara byter namn på dem i frågeresultaten.

Exempel

Anta att vi returnerar innehållet i en samling så här:

db.employees.find()

Resultat:

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

Här använder vi find() metod för att returnera innehållet i samlingen.

I det här fallet returneras namnen på varje fält i resultaten.

Men tänk om vi ville att fältnamnen skulle vara annorlunda? Till exempel, vad händer om vi vill ersätta name med anställd ?

I så fall kan vi använda aggregate() metod för att utföra en fråga som denna:

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

Resultat:

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

Observera att MongoDB visar fälten i infogningsordning, vilket resulterar i lön fältet visas före anställd fält. Om det är oacceptabelt kan vi alltid ändra frågan till detta:

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

Resultat:

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

Byt namn på fält i inbäddade dokument

Du kan använda samma metod för att byta namn på fält i inbäddade dokument. I det här fallet, använd punktnotation för att referera till fältet som du vill byta namn på.

Anta att vi kör följande fråga mot ett husdjur samling:

db.pets.find().pretty()

Resultat:

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

Vi kan byta namn på fält på de inbäddade dokumenten så här:

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

Resultat:

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

I det här fallet valde jag inte alla fält i de inbäddade dokumenten, men du fattar.

Jag använde också "_id":0 för att utelämna _id fältet.

Observera också att om ett dokument faktiskt inte har ett fält som är specificerat i $project steg, så kommer det helt enkelt att utelämnas i det resulterande dokumentet. Du kan se detta i det första dokumentet, som utelämnar Born fältet och det andra dokumentet, som utelämnar Typ fältet.


  1. Bild som returneras från REST API visas alltid trasig

  2. MongoDB $binarySize

  3. Yii2 + Redis som databas

  4. Hur kontrollerar jag om redis körs innan jag startar kolven (och startar den om den inte är det)?