sql >> Database >  >> NoSQL >> MongoDB

Hernoem een ​​veld in de queryresultaten in MongoDB

Soms, wanneer u een verzameling in MongoDB opvraagt, bent u misschien niet tevreden met de veldnamen. Standaard zijn de veldnamen een weerspiegeling van de veldnamen in de eigenlijke documenten.

Misschien zijn de veldnamen inconsistent of is er een typfout. Wat de reden ook is, u kunt het $project . gebruiken aggregatiepijplijnfase om de naam van een veld in uw zoekopdrachtresultaten te wijzigen.

In sommige opzichten is dit vergelijkbaar met het gebruik van een alias in SQL, omdat het de onderliggende velden niet hernoemt, maar ze gewoon hernoemt in de queryresultaten.

Voorbeeld

Stel dat we de inhoud van een verzameling als volgt retourneren:

db.employees.find()

Resultaat:

{ "_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 gebruiken we de find() methode om de inhoud van de verzameling te retourneren.

In dit geval worden de namen van elk veld geretourneerd in de resultaten.

Maar wat als we wilden dat de veldnamen anders waren? Wat als we bijvoorbeeld name . willen vervangen? met employee ?

In dat geval zouden we de aggregate() . kunnen gebruiken methode om een ​​query als deze uit te voeren:

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

Resultaat:

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

Merk op dat MongoDB de velden weergeeft in de volgorde van invoegen, wat resulteert in het salary veld dat wordt weergegeven voor de employee veld. Als dat onaanvaardbaar is, kunnen we de vraag altijd zo veranderen:

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

Resultaat:

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

De naam van velden in ingesloten documenten wijzigen

U kunt dezelfde methode gebruiken om de naam van velden in ingesloten documenten te wijzigen. Gebruik in dit geval puntnotatie om naar het veld te verwijzen waarvan u de naam wilt wijzigen.

Stel dat we de volgende query uitvoeren op een pets collectie:

db.pets.find().pretty()

Resultaat:

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

We kunnen velden in de ingesloten documenten als volgt hernoemen:

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

Resultaat:

{ "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 dit geval heb ik niet alle velden in de ingesloten documenten geselecteerd, maar je snapt het idee.

Ik heb ook "_id": 0 . gebruikt om de _id weg te laten veld.

Merk ook op dat als een document niet echt een veld heeft dat is gespecificeerd in het $project stadium, dan wordt het gewoon weggelaten in het resulterende document. Je kunt dit zien in het eerste document, dat de Born . weglaat veld, en het tweede document, dat het Type . weglaat veld.


  1. Bulkopname in Redis

  2. Abonneer je op meerdere kanalen met dezelfde thread Jedis

  3. Kan geen index maken in mongodb, sleutel te groot om te indexeren

  4. Mongo push naar array binnen array