1. Panoramica
In questo tutorial impareremo come recuperare un valore da MongoDB in base al nome della chiave. Esploreremo vari metodi di MongoDB, per recuperare i nomi dei campi chiave dei documenti in base ai filtri applicati. Per prima cosa, utilizzeremo trova o trovato metodo per recuperare i dati richiesti e successivamente utilizzare l'aggregazione metodo. Qui scriveremo query sia nella query della shell MongoDB che nel codice del driver Java.
Diamo un'occhiata ai diversi modi per recuperare il valore in MongoDB tramite un nome di campo.
2. Inizializzazione database
Per iniziare, dobbiamo creare un nuovo database baeldung e una nuova collezione, viaggia :
use baeldung;
db.createCollection(travel);
Aggiungiamo ora alcuni dati fittizi alla raccolta utilizzando insertMany metodo di 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]"
}
]);
Quanto sopra insertMany query restituirà il seguente JSON:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("623d7f079d55d4e137e47825"),
ObjectId("623d7f079d55d4e137e47826"),
ObjectId("623d7f079d55d4e137e47827"),
ObjectId("623d7f079d55d4e137e47828")
]
}
Finora abbiamo inserito i dati fittizi nella collezione travel .
3. Usando il trova Metodo
Il trovare il metodo trova e restituisce i documenti che corrispondono ai criteri di query specificati nella raccolta. Se più documenti soddisfano la condizione, restituirà tutti i documenti in base all'ordine dei documenti sul disco. Inoltre, in MongoDB, trova il metodo supporta la proiezione dei parametri nella query. Se specifichiamo un parametro di proiezione in trova metodo, restituirà tutti i documenti contenenti solo campi di proiezione.
Un punto chiave da notare è che _id il campo è sempre incluso nella risposta a meno che non venga rimosso esplicitamente.
Per dimostrare, esaminiamo la query della shell per proiettare un campo chiave:
db.travel.find({},{"passengerId":1}).pretty();
La risposta alla domanda di cui sopra sarà:
{ "_id" : ObjectId("623d7f079d55d4e137e47825"), "passengerId" : 145 }
{ "_id" : ObjectId("623d7f079d55d4e137e47826"), "passengerId" : 148 }
{ "_id" : ObjectId("623d7f079d55d4e137e47827"), "passengerId" : 154 }
{ "_id" : ObjectId("623d7f079d55d4e137e47828"), "passengerId" : 168 }
Qui, in questa query, abbiamo semplicemente proiettato il passengerId. Esaminiamo ora il campo chiave con l'esclusione di _id :
db.travel.find({},{"passengerId":1,"_id":0}).pretty();
La query di cui sopra avrà la seguente risposta:
{ "passengerId" : 145 }
{ "passengerId" : 148 }
{ "passengerId" : 154 }
{ "passengerId" : 168 }
Qui, in questa query, abbiamo escluso _id campo dalla proiezione della risposta. Vediamo il codice del driver Java per la query precedente:
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());
}
Nel codice sopra, per prima cosa, abbiamo creato un MongoClient connessione con il server mongo locale in esecuzione sulla porta 27017 . Successivamente, abbiamo utilizzato trova metodo, che ha due parametri, queryFilter, e proiezione. La query DBObject contiene i filtri su cui dobbiamo recuperare i dati. Qui abbiamo stampato tutti i campi proiettati dei documenti di viaggio utilizzando il DBCursor .
4. Utilizzando l'aggregazione Metodo
L'aggregazione le operazioni in MongoDB elaborano record di dati e documenti e restituiscono risultati calcolati. Raccoglie valori da vari documenti e li raggruppa prima di eseguire diversi tipi di operazioni sui dati raggruppati, come somma, media, minimo, massimo, ecc.
Possiamo utilizzare la pipeline di aggregazione MongoDB quando è necessario eseguire un'aggregazione più complessa. Le pipeline di aggregazione sono raccolte di fasi combinate con la sintassi delle query MongoDB per produrre risultati aggregati.
Esaminiamo la query di aggregazione per recuperare il valore in base al nome della chiave:
db.travel.aggregate([
{
"$project":{
"passengerId":1
}
}
]).pretty();
La risposta alla query di aggregazione di cui sopra sarà:
{ "_id" : ObjectId("623d7f079d55d4e137e47825"), "passengerId" : 145 }
{ "_id" : ObjectId("623d7f079d55d4e137e47826"), "passengerId" : 148 }
{ "_id" : ObjectId("623d7f079d55d4e137e47827"), "passengerId" : 154 }
{ "_id" : ObjectId("623d7f079d55d4e137e47828"), "passengerId" : 168 }
In questo caso, abbiamo utilizzato il $project fase della pipeline di aggregazione. $progetto specifica quali campi includere o escludere. Nella nostra query, abbiamo passato l'ID passeggero solo nella fase di proiezione.
Diamo un'occhiata al codice del driver Java per la query precedente:
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);
Possiamo anche scrivere la pipeline di aggregazione nel modo seguente:
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);
Abbiamo creato una pipeline di aggregazione con il codice del driver java e impostato la fase del progetto solo per includere passengerId campo. Infine, abbiamo passato la pipeline di aggregazione all'aggregato metodo per recuperare i dati.