Overview
Puede realizar operaciones de búsqueda para recuperar datos de su base de datos MongoDB. Puede realizar una operación de búsqueda para encontrar documentos según un conjunto de criterios llamando a find() o método findOne().
Tip
Interactive Lab
Esta página incluye un breve laboratorio interactivo que demuestra cómo recuperar datos usando el método find(). Se puede completar este laboratorio directamente en la ventana del navegador sin instalar MongoDB o un editor de código.
Para iniciar el laboratorio, haga clic en el Open Interactive Tutorial Botón en la parte superior de la página. Para ampliar el laboratorio a pantalla completa, haga clic en el botón de pantalla completa (⛶) en la esquina superior derecha del panel del laboratorio.
También puedes especificar más detalladamente la información que devuelve la operación de búsqueda especificando parámetros opcionales o encadenando otros métodos, como se muestra en las siguientes guías:
También se puede usar una operación de agregación para recuperar datos. Este tipo de operación permite aplicar un pipeline ordenado de transformaciones a los datos coincidentes.
Si desea supervisar la base de datos para detectar datos entrantes que coincidan con un conjunto de criterios, puede utilizar la operación de observación para recibir notificaciones en tiempo real cuando se inserten datos coincidentes.
Nota
La operación de la query puede devolver una referencia a un cursor que contiene documentos coincidentes. Para aprender cómo examinar los datos almacenados en el cursor, consulta la página Acceso a los datos desde un cursor.
Puedes usar el driver de Nodo.js para conectarte y realizar operaciones de lectura en implementaciones alojadas en los siguientes entornos:
MongoDB Atlas: El servicio totalmente gestionado para implementaciones de MongoDB en la nube
MongoDB Enterprise: la versión basada en suscripción y autogestionada de MongoDB
MongoDB Community: la versión de MongoDB con código fuente disponible, gratuita y autogestionada
Para obtener más información sobre cómo realizar operaciones de lectura en la interfaz de usuario de Atlas para implementaciones alojadas en MongoDB Atlas, consulta Ver, filtrar y ordenar documentos.
Búsqueda de documentos
Se puede llamar al método find() en un objeto Collection. El método acepta un documento de query que describe los documentos que se desean recuperar. Para más información sobre cómo especificar el documento de query, se debe consultar la guía Especificar una query.
Tip
Sin criterios de query
Para ejecutar una operación de búsqueda que no tiene criterios de query, puedes pasar una query vacía u omitir el documento de query en los parámetros del método find.
Las siguientes operaciones devuelven todos los documentos de la colección myColl:
myColl.find(); // no query myColl.find({}); // empty query
Si no pasa una query o pasa una query vacía al método findOne(), la operación devuelve un solo documento de una colección.
Puedes encadenar métodos de cursor a una operación de búsqueda incluso cuando pasa una query vacía. Por ejemplo, el siguiente código muestra cómo puede especificar una proyección al realizar una operación de búsqueda que recibe un parámetro de query vacío:
const projectFields = { _id: 0, field1: 1 }; const findResult = await myColl.findOne().project(projectFields);
Para obtener más información sobre la proyección de campos de documentos, consulte la guía Especificar qué campos devolver.
El método find() devuelve una instancia Cursor desde la cual se puede acceder a los documentos coincidentes. El método findOne() devuelve una instancia Promise, que se puede resolver para acceder al documento coincidente o a un valor null si no hay coincidencias.
Ejemplo
Un restaurante de pizzas desea encontrar todas las pizzas que Lemony Snicket pidió ayer. Ejecutan la siguiente query find() en la colección orders:
// Search for orders by name and within a specific date range const findResult = orders.find({ name: "Lemony Snicket", date: { $gte: new Date(new Date().setHours(00, 00, 00)), $lt: new Date(new Date().setHours(23, 59, 59)), }, });
Una vez que la operación regresa, la variable findResult hace referencia a un Cursor. Puede imprimir los documentos recuperados utilizando la sintaxis for await...of como se muestra a continuación:
for await (const doc of findResult) { console.log(doc); }
El resultado podría asemejarse al siguiente:
[ { name: "Lemony Snicket", type: "horseradish pizza", qty: 1, status: "delivered", date: ... }, { name: "Lemony Snicket", type: "coal-fired oven pizza", qty: 3, status: "canceled", date: ...}, ... ]
Ejemplo de findOne(): Archivo completo
Nota
Configuración de ejemplo
Este ejemplo se conecta a una instancia de MongoDB con un URI de conexión. Para obtener más información sobre cómo realizar la conexión a la instancia de MongoDB, se debe consultar la guía Conexión a MongoDB. Este ejemplo también usa la colección movies en la base de datos sample_mflix incluida en los conjuntos de datos de muestra de Atlas. Se pueden cargar en la base de datos en el nivel gratuito de MongoDB Atlas siguiendo la guía de Introducción a MongoDB.
El siguiente ejemplo de archivo completo encuentra un único documento de la colección movies. Utiliza los siguientes parámetros:
Filtro que coincide con documentos en los que el valor de
titlees'The Room'.Orden que organiza los documentos coincidentes en orden descendente por calificación, de modo que si la query coincide con varios documentos, el documento devuelto será el documento con la calificación más alta.
Proyección que excluye explícitamente el campo
_idde los documentos devueltos e incluye explícitamente solo el objetotitley el objetoimdb(y sus campos incrustados).
import { MongoClient } from "mongodb"; // Replace the uri string with your MongoDB deployment's connection string. const uri = "<connection string uri>"; const client = new MongoClient(uri); async function run() { try { // Get the database and collection on which to run the operation const database = client.db("sample_mflix"); const movies = database.collection("movies"); // Query for a movie that has the title 'The Room' const query = { title: "The Room" }; const options = { // Sort matched documents in descending order by rating sort: { "imdb.rating": -1 }, // Include only the `title` and `imdb` fields in the returned document projection: { _id: 0, title: 1, imdb: 1 }, }; // Execute query const movie = await movies.findOne(query, options); // Print the document returned by findOne() console.log(movie); } finally { await client.close(); } } run().catch(console.dir);
import { MongoClient } from "mongodb"; // Replace the uri string with your MongoDB deployment's connection string. const uri = "<connection string uri>"; const client = new MongoClient(uri); interface IMDB { rating: number; votes: number; id: number; } export interface Movie { title: string; year: number; released: Date; plot: string; type: "movie" | "series"; imdb: IMDB; } type MovieSummary = Pick<Movie, "title" | "imdb">; async function run(): Promise<void> { try { const database = client.db("sample_mflix"); // Specifying a Schema is always optional, but it enables type hinting on // finds and inserts const movies = database.collection<Movie>("movies"); const movie = await movies.findOne<MovieSummary>( { title: "The Room" }, { sort: { rating: -1 }, projection: { _id: 0, title: 1, imdb: 1 }, } ); console.log(movie); } finally { await client.close(); } } run().catch(console.dir);
Al ejecutar el ejemplo anterior, se produce el siguiente resultado:
{ title: 'The Room', imdb: { rating: 3.5, votes: 25673, id: 368226 } }
Ejemplo de find(): archivo completo
Nota
Configuración de ejemplo
Este ejemplo se conecta a una instancia de MongoDB con un URI de conexión. Para obtener más información sobre cómo realizar la conexión a la instancia de MongoDB, se debe consultar la guía Conexión a MongoDB. Este ejemplo también usa la colección movies en la base de datos sample_mflix incluida en los conjuntos de datos de muestra de Atlas. Se pueden cargar en la base de datos en el nivel gratuito de MongoDB Atlas siguiendo la guía de Introducción a MongoDB.
El siguiente ejemplo de archivo completo encuentra documentos de la colección movies. Utiliza los siguientes parámetros:
Filtro que coincide con documentos en los que el valor
runtimees menor que 15 minutos.Orden que organiza los documentos devueltos en orden ascendente por título (orden alfabético en el que "A" viene antes de "Z" y "1" antes de "9").
Proyección que excluye explícitamente el campo
_idde los documentos devueltos e incluye explícitamente solo el objetotitley el objetoimdb(y sus campos incrustados).
1 import { MongoClient } from "mongodb"; 2 3 // Replace the uri string with your MongoDB deployment's connection string. 4 const uri = "<connection string uri>"; 5 6 const client = new MongoClient(uri); 7 8 async function run() { 9 try { 10 11 // Get the database and collection on which to run the operation 12 const database = client.db("sample_mflix"); 13 const movies = database.collection("movies"); 14 15 // Query for movies that have a runtime less than 15 minutes 16 const query = { runtime: { $lt: 15 } }; 17 const sortFields = { title: 1 }; 18 const projectFields = { _id: 0, title: 1, imdb: 1 }; 19 20 // Execute query 21 const cursor = movies.find(query).sort(sortFields).project(projectFields); 22 23 // Print a message if no documents were found 24 if ((await movies.countDocuments(query)) === 0) { 25 console.log("No documents found!"); 26 } 27 28 // Print returned documents 29 for await (const doc of cursor) { 30 console.dir(doc); 31 } 32 33 } finally { 34 await client.close(); 35 } 36 } 37 run().catch(console.dir);
1 import { MongoClient } from "mongodb"; 2 3 // Replace the uri string with your MongoDB deployment's connection string. 4 const uri = "<connection string uri>"; 5 6 const client = new MongoClient(uri); 7 8 type Minutes = number; 9 10 interface IMDB { 11 rating: number; 12 votes: number; 13 id: number; 14 } 15 16 interface Movie { 17 title: string; 18 imdb: IMDB; 19 runtime: Minutes; 20 } 21 22 async function run() { 23 try { 24 const database = client.db("sample_mflix"); 25 const movies = database.collection<Movie>("movies"); 26 27 const query = { runtime: { $lt: 15 } }; 28 const sortFields = { title: 1 }; 29 const projectFields = { _id: 0, title: 1, imdb: 1 }; 30 31 const cursor = movies.find<Movie>(query).sort(sortFields).project(projectFields); 32 33 if ((await movies.countDocuments(query)) === 0) { 34 console.warn("No documents found!"); 35 } 36 37 for await (const doc of cursor) { 38 console.dir(doc); 39 } 40 } finally { 41 await client.close(); 42 } 43 } 44 run().catch(console.dir);
Al ejecutar el ejemplo anterior, se produce el siguiente resultado:
{ title: '10 Minutes', imdb: { rating: 7.9, votes: 743, id: 339976 } } { title: '3x3', imdb: { rating: 6.9, votes: 206, id: 1654725 } } { title: '7:35 in the Morning', imdb: { rating: 7.3, votes: 1555, id: 406501 } } { title: '8', imdb: { rating: 7.8, votes: 883, id: 1592502 } } ...
Nota
Se debe encadenar un método de cursor como sort(), limit(), skip() o project() a una operación de lectura antes de iterar el cursor. Si se especifica un método de cursor después de iterar el cursor, la configuración no se aplica a la operación de lectura.
Información Adicional
Para obtener más información sobre los métodos findOne() y find(), consulta la siguiente documentación del manual del Servidor:
Agregar datos de documentos
Si se desea ejecutar un pipeline de procesamiento personalizado para recuperar datos de la base de datos, se puede utilizar el método aggregate(). Este método acepta expresiones de agregación para ejecutarlas en secuencia. Estas expresiones permiten filtrar, agrupar y organizar los datos de resultados de una colección.
Ejemplo
Una pizzería desea ejecutar un informe de estado on-demand para resumir los pedidos de pizza de la última semana. Ejecutan la siguiente query aggregate() en la colección orders para obtener los totales de cada campo "status" distinto:
// Group orders by status within the last week const aggregateResult = orders.aggregate([ { $match: { date: { $gte: new Date(new Date().getTime() - 1000 * 3600 * 24 * 7), $lt: new Date(), }, }, }, { $group: { _id: "$status", count: { $sum: 1, }, }, }, ]);
Una vez que la operación regresa, la variable aggregateResult hace referencia a un Cursor. Puede imprimir los documentos recuperados utilizando la sintaxis for await...of como se muestra a continuación:
for await (const doc of aggregateResult) { console.log(doc); }
El resultado podría asemejarse al siguiente:
[ { _id: 'delivering', count: 5 }, { _id: 'delivered', count: 37 }, { _id: 'created', count: 9 } ]
Información Adicional
Para obtener más información sobre cómo construir una canalización de agregación, consulta la guía de operaciones de agregación o el manual del servidor.
Supervisar los cambios en los datos
Puede usar el método watch() para supervisar una colección en busca de cambios que cumplan ciertos criterios. Estos cambios incluyen documentos insertados, actualizados, reemplazados y borrados. Puedes pasar a este método un pipeline de comandos de agregación que se ejecuta secuencialmente en los datos modificados cada vez que se realizan operaciones de guardar en la colección.
Ejemplo
Un restaurante de pizza desea recibir una notificación cada vez que se recibe un nuevo pedido de pizza. Para lograr esto, crean un pipeline de agregación para aplicar un filtro en las operaciones de inserción y devolver campos específicos. Pasan este pipeline al método watch() llamado en la colección orders, como se muestra a continuación:
// Set up a change stream to listen for new order insertions const changeStream = orders.watch([ { $match: { operationType: "insert" } }, { $project: { "fullDocument.name": 1, "fullDocument.address": 1, }, }, ]); changeStream.on("change", change => { const { name, address } = change.fullDocument; console.log(`New order for ${name} at ${address}.`); });
Información Adicional
Para obtener un ejemplo ejecutable del método watch(), consulta la sección de ejemplos en la guía Supervisar datos con Change Streams.