MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Rinominare un campo nei risultati della query in MongoDB

A volte, quando esegui query su una raccolta in MongoDB, potresti non essere soddisfatto dei nomi dei campi. Per impostazione predefinita, i nomi dei campi sono semplicemente un riflesso dei nomi dei campi nei documenti effettivi.

Forse i nomi dei campi non sono coerenti o c'è un errore di battitura. Qualunque sia la ragione, puoi usare il $project fase della pipeline di aggregazione per rinominare un campo nei risultati della query.

In un certo senso, questo è paragonabile all'utilizzo di un alias in SQL, poiché non rinomina i campi sottostanti, li rinomina semplicemente nei risultati della query.

Esempio

Supponiamo di restituire il contenuto di una raccolta come questa:

db.employees.find()

Risultato:

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

Qui utilizziamo find() metodo per restituire il contenuto della raccolta.

In questo caso, nei risultati vengono restituiti i nomi di ciascun campo.

Ma cosa accadrebbe se volessimo che i nomi dei campi fossero diversi? Ad esempio, cosa succede se vogliamo sostituire name con employee ?

In tal caso potremmo usare aggregate() metodo per eseguire una query come questa:

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

Risultato:

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

Nota che MongoDB mostra i campi nell'ordine di inserimento, che risulta nel salary campo presentato prima del employee campo. Se ciò è inaccettabile, possiamo sempre modificare la query in questo:

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

Risultato:

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

Rinomina i campi nei documenti incorporati

È possibile utilizzare lo stesso metodo per rinominare i campi nei documenti incorporati. In questo caso, usa la notazione punto per fare riferimento al campo che vuoi rinominare.

Supponiamo di eseguire la seguente query su un pets collezione:

db.pets.find().pretty()

Risultato:

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

Possiamo rinominare i campi sui documenti incorporati in questo modo:

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

Risultato:

{ "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 questo caso non ho selezionato tutti i campi nei documenti incorporati, ma ti sei fatto un'idea.

Ho anche usato "_id": 0 per omettere il _id campo.

Tieni inoltre presente che se un documento non ha effettivamente un campo specificato nel $project fase, quindi verrà semplicemente omesso nel documento risultante. Puoi vederlo nel primo documento, che omette il Born campo e il secondo documento, che omette il Type campo.