MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Zmień nazwę pola w wynikach zapytania w MongoDB

Czasami, gdy wysyłasz zapytanie do kolekcji w MongoDB, możesz nie być zadowolony z nazw pól. Domyślnie nazwy pól są po prostu odzwierciedleniem nazw pól w rzeczywistych dokumentach.

Być może nazwy pól są niespójne lub jest literówka. Niezależnie od powodu, możesz użyć $project etap potoku agregacji, aby zmienić nazwę pola w wynikach zapytania.

Pod pewnymi względami jest to porównywalne z używaniem aliasu w SQL, ponieważ nie zmienia on nazw bazowych pól, po prostu zmienia ich nazwy w wynikach zapytania.

Przykład

Załóżmy, że zwracamy zawartość kolekcji w następujący sposób:

db.employees.find()

Wynik:

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

Tutaj używamy find() metoda, aby zwrócić zawartość kolekcji.

W takim przypadku w wynikach zwracane są nazwy każdego pola.

Ale co, jeśli chcielibyśmy, aby nazwy pól były inne? Na przykład, co jeśli chcemy zastąpić name z employee ?

W takim przypadku moglibyśmy użyć aggregate() metoda do wykonania zapytania w ten sposób:

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

Wynik:

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

Zauważ, że MongoDB wyświetla pola w kolejności wstawiania, co skutkuje salary pole prezentowane przed employee pole. Jeśli jest to niedopuszczalne, zawsze możemy zmienić zapytanie na to:

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

Wynik:

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

Zmień nazwy pól w osadzonych dokumentach

W ten sam sposób możesz zmienić nazwy pól w osadzonych dokumentach. W takim przypadku użyj notacji kropkowej, aby odnieść się do pola, którego nazwę chcesz zmienić.

Załóżmy, że uruchamiamy następujące zapytanie wobec pets kolekcja:

db.pets.find().pretty()

Wynik:

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

Możemy zmienić nazwy pól w osadzonych dokumentach w ten sposób:

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

Wynik:

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

W tym przypadku nie zaznaczyłem wszystkich pól w osadzonych dokumentach, ale masz pomysł.

Użyłem również "_id": 0 aby pominąć _id pole.

Zwróć też uwagę, że jeśli dokument w rzeczywistości nie ma pola określonego w $project etap, to zostanie po prostu pominięty w wynikowym dokumencie. Możesz to zobaczyć w pierwszym dokumencie, który pomija Born pole i drugi dokument, w którym pominięto Type pole.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongoose:jakie są różnice między Model.create i Collection.insert

  2. Kopiuj/klonuj kolekcję w MongoDB

  3. Utwórz indeks geoprzestrzenny 2dsphere dla zapytań sferycznych w MongoDB

  4. Znajdź i policz elementy kolekcji z Mongoose

  5. Jak korzystać z Elasticsearch z MongoDB?