Docs Menu
Docs Home
/ /

Buscar documentos

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:

  • Especifica los documentos a devolver

  • Especifica qué campos se deben devolver

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.

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: ...},
...
]

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 title es '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 _id de los documentos devueltos e incluye explícitamente solo el objeto title y el objeto imdb (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 } }

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 runtime es 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 _id de los documentos devueltos e incluye explícitamente solo el objeto title y el objeto imdb (y sus campos incrustados).

1import { MongoClient } from "mongodb";
2
3// Replace the uri string with your MongoDB deployment's connection string.
4const uri = "<connection string uri>";
5
6const client = new MongoClient(uri);
7
8async 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}
37run().catch(console.dir);
1import { MongoClient } from "mongodb";
2
3// Replace the uri string with your MongoDB deployment's connection string.
4const uri = "<connection string uri>";
5
6const client = new MongoClient(uri);
7
8type Minutes = number;
9
10interface IMDB {
11 rating: number;
12 votes: number;
13 id: number;
14}
15
16interface Movie {
17 title: string;
18 imdb: IMDB;
19 runtime: Minutes;
20}
21
22async 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}
44run().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.

Para obtener más información sobre los métodos findOne() y find(), consulta la siguiente documentación del manual del Servidor:

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 }
]

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.

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}.`);
});

Para obtener un ejemplo ejecutable del método watch(), consulta la sección de ejemplos en la guía Supervisar datos con Change Streams.

Volver

Insertar documentos

En esta página