sql >> Base de Datos >  >> NoSQL >> MongoDB

Recuperar un valor de MongoDB por su nombre clave

1. Resumen

En este tutorial, aprenderemos cómo recuperar un valor de MongoDB por nombre de clave. Exploraremos varios métodos de MongoDB para obtener los nombres de los campos clave de los documentos en función de los filtros aplicados. Primero, usaremos el buscar o encontrar para obtener los datos requeridos y luego usar la agregación método. Aquí, escribiremos consultas tanto en la consulta de shell MongoDB como en el código del controlador Java.

Veamos las diferentes formas de recuperar el valor en MongoDB por un nombre de campo.

2. Inicialización de la base de datos

Para comenzar, necesitamos configurar una nueva base de datos baeldung y una nueva colección, viajes :

use baeldung;
db.createCollection(travel);

Ahora agreguemos algunos datos ficticios a la colección usando insertMany método de 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]"
}
]);

El anterior insertMany la consulta devolverá el siguiente JSON:

{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("623d7f079d55d4e137e47825"),
	ObjectId("623d7f079d55d4e137e47826"),
	ObjectId("623d7f079d55d4e137e47827"),
        ObjectId("623d7f079d55d4e137e47828")
    ]
}

Hasta ahora, hemos insertado los datos ficticios en la colección travel .

3. Uso de buscar Método

El encontrar El método busca y devuelve documentos que coinciden con los criterios de consulta especificados en la colección. Si varios documentos coinciden con la condición, devolverá todos los documentos según el orden de los documentos en el disco. Además, en MongoDB, el find El método admite la proyección de parámetros en la consulta. Si especificamos un parámetro de proyección en el buscar método, devolverá todos los documentos que contengan solo campos de proyección.

Un punto clave a tener en cuenta es que el _id el campo siempre se incluye en la respuesta a menos que se elimine explícitamente.

Para demostrarlo, veamos la consulta de shell para proyectar un campo clave:

db.travel.find({},{"passengerId":1}).pretty();

La respuesta a la consulta anterior será:

{ "_id" : ObjectId("623d7f079d55d4e137e47825"), "passengerId" : 145 }
{ "_id" : ObjectId("623d7f079d55d4e137e47826"), "passengerId" : 148 }
{ "_id" : ObjectId("623d7f079d55d4e137e47827"), "passengerId" : 154 }
{ "_id" : ObjectId("623d7f079d55d4e137e47828"), "passengerId" : 168 }

Aquí, en esta consulta, simplemente proyectamos el pasajeroId. Veamos ahora el campo clave con la exclusión de _id :

db.travel.find({},{"passengerId":1,"_id":0}).pretty();

La consulta anterior tendrá la siguiente respuesta:

{ "passengerId" : 145 }
{ "passengerId" : 148 }
{ "passengerId" : 154 }
{ "passengerId" : 168 }

Aquí, en esta consulta, excluimos el _id campo de la proyección de respuesta. Veamos el código del controlador Java para la consulta anterior:

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());
}

En el código anterior, primero creamos un MongoClient conexión con el servidor mongo local que se ejecuta en el puerto 27017 . A continuación, usamos el buscar método, que tiene dos parámetros, el queryFilter, y proyección. La consulta DBObject contiene los filtros en los que necesitamos obtener los datos. Aquí imprimimos todos los campos proyectados de los documentos de viaje usando el DBCursor .

4. Uso de la agregación Método

La agregación Las operaciones en MongoDB procesan registros de datos y documentos y devuelven resultados calculados. Recopila valores de varios documentos y los agrupa antes de realizar diferentes tipos de operaciones en los datos agrupados, como suma, promedio, mínimo, máximo, etc.

Podemos usar la canalización de agregación de MongoDB cuando necesitamos hacer una agregación más compleja. Los canales de agregación son colecciones de etapas combinadas con la sintaxis de consulta de MongoDB para generar resultados agregados.

Analicemos la consulta de agregación para recuperar el valor por nombre de clave:

db.travel.aggregate([
{
    "$project":{
        "passengerId":1
    }
}
]).pretty();

La respuesta a la consulta de agregación anterior será:

{ "_id" : ObjectId("623d7f079d55d4e137e47825"), "passengerId" : 145 }
{ "_id" : ObjectId("623d7f079d55d4e137e47826"), "passengerId" : 148 }
{ "_id" : ObjectId("623d7f079d55d4e137e47827"), "passengerId" : 154 }
{ "_id" : ObjectId("623d7f079d55d4e137e47828"), "passengerId" : 168 }

En este caso, usamos el $proyecto etapa de la tubería de agregación. $proyecto especifica qué campos incluir o excluir. En nuestra consulta, solo pasamos el ID de pasajero a la etapa de proyección.

Veamos el código del controlador Java para la consulta anterior:

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);

También podemos escribir la tubería de agregación de la siguiente manera:

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);

Creamos una tubería de agregación con el código del controlador Java y configuramos la etapa del proyecto solo para incluir el passengerId campo. Finalmente, pasamos la canalización de agregación al agregado método para recuperar los datos.