1. Přehled
V tomto tutoriálu se naučíme, jak načíst hodnotu z MongoDB podle názvu klíče. Prozkoumáme různé metody MongoDB, abychom získali názvy klíčových polí dokumentů na základě použitých filtrů. Nejprve použijeme najít nebo nalezeno metoda k načtení požadovaných dat a pozdější použití agregace metoda. Zde budeme psát dotazy jak v dotazu prostředí MongoDB, tak v kódu ovladače Java.
Podívejme se na různé způsoby, jak získat hodnotu v MongoDB podle názvu pole.
2. Inicializace databáze
Pro začátek musíme nastavit novou databázi baeldung a novou kolekci cestování :
use baeldung;
db.createCollection(travel);
Pojďme nyní do kolekce přidat nějaká fiktivní data pomocí insertMany metoda MongoDB:
db.travel.insertMany([
{
"passengerId":145,
"passengerName":"Nathan Green",
"passengerAge":25,
"sourceStation":"London",
"destinationStation":"Birmingham",
"seatType":"Slepper",
"emailAddress":"[email protected]"
},
{
"passengerId":148,
"passengerName":"Kevin Joseph",
"passengerAge":28,
"sourceStation":"Manchester",
"destinationStation":"London",
"seatType":"Slepper",
"emailAddress":"[email protected]"
},
{
"passengerId":154,
"passengerName":"Sheldon burns",
"passengerAge":26,
"sourceStation":"Cambridge",
"destinationStation":"Leeds",
"seatType":"Slepper",
"emailAddress":"[email protected]"
},
{
"passengerId":168,
"passengerName":"Jack Ferguson",
"passengerAge":24,
"sourceStation":"Cardiff",
"destinationStation":"Coventry",
"seatType":"Slepper",
"emailAddress":"[email protected]"
}
]);
Výše uvedené vložte mnoho dotaz vrátí následující JSON:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("623d7f079d55d4e137e47825"),
ObjectId("623d7f079d55d4e137e47826"),
ObjectId("623d7f079d55d4e137e47827"),
ObjectId("623d7f079d55d4e137e47828")
]
}
Doposud jsme fiktivní data vložili do kolekce cestování .
3. Pomocí najít Metoda
Najít metoda vyhledá a vrátí dokumenty, které odpovídají zadaným kritériím dotazu v kolekci. Pokud podmínce odpovídá více dokumentů, vrátí všechny dokumenty podle pořadí dokumentů na disku. Navíc v MongoDB, najít metoda podporuje projekci parametrů v dotazu. Pokud zadáme parametr projekce v find metoda, vrátí všechny dokumenty obsahující pouze pole projekce.
Jedním z klíčových bodů, které je třeba poznamenat, je _id pole je vždy zahrnuto v odpovědi, pokud není výslovně odstraněno.
Abychom to demonstrovali, podívejme se na dotaz shellu, abychom promítli klíčové pole:
db.travel.find({},{"passengerId":1}).pretty();
Odpověď na výše uvedený dotaz bude:
{ "_id" : ObjectId("623d7f079d55d4e137e47825"), "passengerId" : 145 }
{ "_id" : ObjectId("623d7f079d55d4e137e47826"), "passengerId" : 148 }
{ "_id" : ObjectId("623d7f079d55d4e137e47827"), "passengerId" : 154 }
{ "_id" : ObjectId("623d7f079d55d4e137e47828"), "passengerId" : 168 }
Zde jsme v tomto dotazu jednoduše promítli passengerId. Nyní se podíváme do klíčového pole s vyloučením _id :
db.travel.find({},{"passengerId":1,"_id":0}).pretty();
Výše uvedený dotaz bude mít následující odpověď:
{ "passengerId" : 145 }
{ "passengerId" : 148 }
{ "passengerId" : 154 }
{ "passengerId" : 168 }
Zde jsme v tomto dotazu vyloučili _id pole z projekce odezvy. Podívejme se na kód ovladače Java pro výše uvedený dotaz:
MongoClient mongoClient = new MongoClient("localhost", 27017);
DB database = mongoClient.getDB("baeldung");
DBCollection collection = database.getCollection("travel");
BasicDBObject queryFilter = new BasicDBObject();
BasicDBObject projection = new BasicDBObject();
projection.put("passengerId", 1);
projection.put("_id", 0);
DBCursor dbCursor = collection.find(queryFilter, projection);
while (dbCursor.hasNext()) {
System.out.println(dbCursor.next());
}
Ve výše uvedeném kódu jsme nejprve vytvořili MongoClient připojení k místnímu mongo serveru běžícímu na portu 27017 . Dále jsme použili najít metoda, která má dva parametry, queryFilter a projekce. Dotaz DBObject obsahuje filtry, na kterých potřebujeme data načíst. Zde jsme vytiskli všechna projektovaná pole cestovních dokladů pomocí DBCursor .
4. Pomocí agregace Metoda
agregace operace v MongoDB zpracovávají datové záznamy a dokumenty a vracejí vypočítané výsledky. Shromažďuje hodnoty z různých dokumentů a seskupuje je dohromady před provedením různých typů operací se seskupenými daty, jako je součet, průměr, minimum, maximum atd.
Můžeme použít agregační kanál MongoDB, když potřebujeme udělat složitější agregaci. Agregační kanály jsou kolekce fází kombinované se syntaxí dotazů MongoDB za účelem získání agregovaných výsledků.
Podívejme se na agregační dotaz, abychom získali hodnotu podle názvu klíče:
db.travel.aggregate([
{
"$project":{
"passengerId":1
}
}
]).pretty();
Odpověď na výše uvedený agregační dotaz bude:
{ "_id" : ObjectId("623d7f079d55d4e137e47825"), "passengerId" : 145 }
{ "_id" : ObjectId("623d7f079d55d4e137e47826"), "passengerId" : 148 }
{ "_id" : ObjectId("623d7f079d55d4e137e47827"), "passengerId" : 154 }
{ "_id" : ObjectId("623d7f079d55d4e137e47828"), "passengerId" : 168 }
V tomto případě jsme použili projekt $ fázi agregačního potrubí. $project určuje, která pole mají být zahrnuta nebo vyloučena. V našem dotazu jsme do fáze projekce předali pouze cestujícího.
Podívejme se na kód ovladače Java pro výše uvedený dotaz:
ArrayList<Document> response = new ArrayList<>();
ArrayList<Document> pipeline = new ArrayList<>(Arrays.asList(new Document("$project", new Document("passengerId", 1L))));
database = mongoClient.getDatabase("baeldung");
database.getCollection("travel").aggregate(pipeline).allowDiskUse(true).into(response);
System.out.println("response:- " + response);
Agregační kanál můžeme také napsat následujícím způsobem:
ArrayList<Document> response = new ArrayList<>();
ArrayList<Bson> pipeline = new ArrayList<>(Arrays.asList(
project(fields(Projections.exclude("_id"), Projections.include("passengerId")))));
MongoDatabase database = mongoClient.getDatabase("baeldung");
database.getCollection("travel").aggregate(pipeline).allowDiskUse(true).into(response);
System.out.println("response:- "+response);
Vytvořili jsme agregační kanál s kódem ovladače java a nastavili jsme fázi projektu pouze tak, aby zahrnovala passengerId pole. Nakonec jsme předali agregační kanál do agregátu metoda k načtení dat.