sql >> Databáze >  >> NoSQL >> MongoDB

Přejmenujte pole ve výsledcích dotazu v MongoDB

Někdy při dotazu na kolekci v MongoDB nemusíte být spokojeni s názvy polí. Ve výchozím nastavení jsou názvy polí jednoduše odrazem názvů polí ve skutečných dokumentech.

Možná jsou názvy polí nekonzistentní nebo je tam překlep. Ať už je důvod jakýkoli, můžete použít $project fázi agregačního kanálu k přejmenování pole ve výsledcích dotazu.

V některých ohledech je to srovnatelné s použitím aliasu v SQL, protože nepřejmenovává základní pole, ale pouze je přejmenovává ve výsledcích dotazu.

Příklad

Předpokládejme, že vrátíme obsah kolekce takto:

db.employees.find()

Výsledek:

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

Zde používáme find() způsob vrácení obsahu sbírky.

V tomto případě jsou ve výsledcích vrácena jména každého pole.

Ale co kdybychom chtěli, aby se názvy polí lišily? Co když například chceme nahradit name s employee ?

V tom případě bychom mohli použít aggregate() metoda k provedení dotazu, jako je tento:

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

Výsledek:

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

Všimněte si, že MongoDB zobrazuje pole v pořadí vložení, což vede k salary pole prezentované před employee pole. Pokud je to nepřijatelné, můžeme dotaz kdykoli změnit na toto:

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

Výsledek:

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

Přejmenovat pole ve vložených dokumentech

Stejnou metodu můžete použít k přejmenování polí ve vložených dokumentech. V tomto případě použijte tečkovou notaci pro odkaz na pole, které chcete přejmenovat.

Předpokládejme, že spustíme následující dotaz proti pets kolekce:

db.pets.find().pretty()

Výsledek:

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

Pole ve vložených dokumentech můžeme přejmenovat takto:

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

Výsledek:

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

V tomto případě jsem nevybral všechna pole ve vložených dokumentech, ale máte představu.

Také jsem použil "_id": 0 vynechat _id pole.

Všimněte si také, že pokud dokument ve skutečnosti nemá pole, které je specifikováno v $project fázi, pak bude ve výsledném dokumentu jednoduše vynechán. Můžete to vidět v prvním dokumentu, který vynechává Born pole a druhý dokument, který vynechává Type pole.


  1. Chyba připojení Mongodb uvnitř kontejneru dockeru

  2. Analyzujte řetězec data ISO8601 k datu s časovým pásmem UTC

  3. Filtrujte pole pomocí operátoru $in ve fázi projektu $

  4. Dočasné selhání v rozlišení názvu redis