MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Преименувайте поле в резултатите от заявката в MongoDB

Понякога, когато правите заявка за колекция в MongoDB, може да не сте доволни от имената на полетата. По подразбиране имената на полетата са просто отражение на имената на полетата в действителните документи.

Може би имената на полетата са непоследователни или има печатна грешка. Каквато и да е причината, можете да използвате $project етап на тръбопровода за агрегиране, за да преименувате поле в резултатите от заявката си.

В някои отношения това е сравнимо с използването на псевдоним в SQL, тъй като не преименува основните полета, а просто ги преименува в резултатите от заявката.

Пример

Да предположим, че връщаме съдържанието на колекция по следния начин:

db.employees.find()

Резултат:

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

Тук използваме find() метод за връщане на съдържанието на колекцията.

В този случай имената на всяко поле се връщат в резултатите.

Но какво ще стане, ако искаме имената на полетата да са различни? Например, какво ще стане, ако искаме да заменим name с employee ?

В този случай бихме могли да използваме aggregate() метод за изпълнение на заявка като тази:

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

Резултат:

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

Имайте предвид, че MongoDB показва полетата в реда на вмъкване, което води до salary поле, което се представя пред employee поле. Ако това е неприемливо, винаги можем да променим заявката на това:

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

Резултат:

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

Преименувайте полета във вградени документи

Можете да използвате същия метод за преименуване на полета във вградени документи. В този случай използвайте нотация с точка, за да се обърнете към полето, което искате да преименувате.

Да предположим, че изпълняваме следната заявка срещу pets колекция:

db.pets.find().pretty()

Резултат:

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

Можем да преименуваме полета във вградените документи по следния начин:

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

Резултат:

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

В този случай не избрах всички полета във вградените документи, но разбирате идеята.

Използвах също "_id": 0 за да пропуснете _id поле.

Също така имайте предвид, че ако документът всъщност няма поле, което е посочено в $project етап, тогава той просто ще бъде пропуснат в получения документ. Можете да видите това в първия документ, който пропуска Born поле и втория документ, който пропуска Type поле.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Сортиране по множество полета mongo DB

  2. как да използвам попълване и агрегиране в едно и също изявление?

  3. Как да заобиколим липсата на транзакции в MongoDB?

  4. Как да върна актуализиран документ от метода findOneAndUpdate?

  5. Не може да се стартира изображението на Docker mongo на Windows