1. Oversigt
I denne vejledning lærer vi, hvordan du henter en værdi fra MongoDB efter nøglenavn. Vi vil udforske forskellige metoder til MongoDB for at hente nøglefeltnavnene på dokumenterne baseret på anvendte filtre. Først bruger vi find eller findone metode til at hente de nødvendige data og senere bruge aggregering metode. Her vil vi skrive forespørgsler både i MongoDB shell-forespørgslen og Java-driverkoden.
Lad os se på de forskellige måder at hente værdien i MongoDB med et feltnavn.
2. Databaseinitialisering
For at begynde skal vi oprette en ny database baeldung og en ny samling, rejse :
use baeldung;
db.createCollection(travel);
Lad os nu tilføje nogle dummy-data til samlingen ved hjælp af insertMany metode til 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]"
}
]);
Ovenstående insertMany forespørgsel returnerer følgende JSON:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("623d7f079d55d4e137e47825"),
ObjectId("623d7f079d55d4e137e47826"),
ObjectId("623d7f079d55d4e137e47827"),
ObjectId("623d7f079d55d4e137e47828")
]
}
Indtil nu har vi indsat dummy-dataene i samlingen rejse .
3. Brug af find Metode
Find metode finder og returnerer dokumenter, der matcher de angivne forespørgselskriterier på samlingen. Hvis flere dokumenter matcher betingelsen, returnerer den alle dokumenter baseret på rækkefølgen af dokumenter på disken. Derudover er find i MongoDB metoden understøtter parameterprojektion i forespørgslen. Hvis vi angiver en projektionsparameter i find metode, returnerer den alle dokumenter, der kun indeholder projektionsfelter.
Et vigtigt punkt at bemærke er, at _id feltet er altid inkluderet i svaret, medmindre det udtrykkeligt er fjernet.
For at demonstrere, lad os se på shell-forespørgslen for at projicere et nøglefelt:
db.travel.find({},{"passengerId":1}).pretty();
Svaret på ovenstående forespørgsel vil være:
{ "_id" : ObjectId("623d7f079d55d4e137e47825"), "passengerId" : 145 }
{ "_id" : ObjectId("623d7f079d55d4e137e47826"), "passengerId" : 148 }
{ "_id" : ObjectId("623d7f079d55d4e137e47827"), "passengerId" : 154 }
{ "_id" : ObjectId("623d7f079d55d4e137e47828"), "passengerId" : 168 }
Her, i denne forespørgsel, projicerede vi simpelthen passengerId. Lad os nu se på nøglefeltet med undtagelse af _id :
db.travel.find({},{"passengerId":1,"_id":0}).pretty();
Ovenstående forespørgsel vil have følgende svar:
{ "passengerId" : 145 }
{ "passengerId" : 148 }
{ "passengerId" : 154 }
{ "passengerId" : 168 }
Her, i denne forespørgsel, udelukkede vi _id felt fra responsprojektionen. Lad os se Java-driverkoden for ovenstående forespørgsel:
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());
}
I ovenstående kode oprettede vi først en MongoClient forbindelse med den lokale mongo-server, der kører på port 27017 . Dernæst brugte vi find metode, som har to parametre, queryFilter, og projektion. Forespørgslen DBObject indeholder de filtre, som vi skal bruge for at hente dataene. Her udskrev vi alle de projekterede felter af rejsedokumenter ved hjælp af DBCursoren .
4. Brug af aggregering Metode
sammenlægningen operationer i MongoDB behandler dataposter og dokumenter og returnerer beregnede resultater. Den indsamler værdier fra forskellige dokumenter og grupperer dem, før den udfører forskellige typer operationer på de grupperede data, såsom sum, gennemsnit, minimum, maksimum osv.
Vi kan bruge MongoDB aggregeringspipeline, når vi skal lave mere kompleks aggregering. Aggregationspipelines er samlinger af stadier kombineret med MongoDB-forespørgselssyntaks for at give aggregerede resultater.
Lad os se på aggregeringsforespørgslen for at hente værdien efter nøglenavn:
db.travel.aggregate([
{
"$project":{
"passengerId":1
}
}
]).pretty();
Svaret på ovenstående aggregeringsforespørgsel vil være:
{ "_id" : ObjectId("623d7f079d55d4e137e47825"), "passengerId" : 145 }
{ "_id" : ObjectId("623d7f079d55d4e137e47826"), "passengerId" : 148 }
{ "_id" : ObjectId("623d7f079d55d4e137e47827"), "passengerId" : 154 }
{ "_id" : ObjectId("623d7f079d55d4e137e47828"), "passengerId" : 168 }
I dette tilfælde brugte vi $project fase af aggregeringsrørledningen. $projekt angiver, hvilke felter der skal inkluderes eller ekskluderes. I vores forespørgsel videregav vi kun passager-id'et til projektionsfasen.
Lad os se på Java-driverkoden for ovenstående forespørgsel:
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);
Vi kan også skrive aggregeringspipelinen på følgende måde:
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);
Vi oprettede en aggregeringspipeline med java-driverkoden og indstillede projektstadiet til kun at inkludere passengerId Mark. Til sidst sendte vi aggregeringspipelinen videre til aggregatet metode til at hente dataene.