Docs Menu
Docs Home
/ /

Integrar MongoDB con Angular

En esta guía, aprenderá a crear una aplicación web Angular que utiliza la pila MEAN. La pila MEAN es un framework de desarrollo web que utiliza MongoDB, Express, Angular y Node.js y consta de las siguientes capas:

  • Capa de base de datos: MongoDB proporciona almacenamiento y recuperación de datos.

  • Capa de aplicación: Express y Node.js constituyen el nivel intermedio para la lógica del lado del servidor.

  • Capa de presentación: Angular implementa la interfaz de usuario y las interacciones del frontend.

Angular es un framework de TypeScript que se utiliza para crear aplicaciones web dinámicas. Ofrece paquetes integrados para diversas funciones de la aplicación, y su arquitectura basada en componentes facilita su reutilización.

Dado que TypeScript se basa en JavaScript, cada elemento de la pila MEAN se basa en JavaScript y JSON. Como resultado, la integración entre estos elementos es sencilla. El frontend de Angular crea documentos JSON que MongoDB puede almacenar directamente en formato BSON, una extensión binaria de JSON, y Express proporciona un framework minimalista que utiliza JavaScript. MongoDB ofrece funciones avanzadas de indexación y consulta para documentos BSON e incluye un controlador nativo de Node.js, lo que lo convierte en un almacén de datos ideal para aplicaciones JavaScript.

Este tutorial muestra cómo crear una aplicación web con la pila MEAN. La aplicación accede a datos de muestra de restaurantes, los consulta y muestra los resultados en un sitio web alojado localmente. El tutorial también incluye instrucciones para conectarse a un clúster de MongoDB alojado en MongoDB Atlas y acceder y mostrar datos de su base de datos.

Tip

Si prefiere conectarse a MongoDB utilizando el controlador Node.js sin Angular, consulte la Comiencea utilizar la guía del controlador Node.js.

Siga los pasos de esta sección para instalar las dependencias del proyecto, crear un clúster Atlas y configurar los directorios de la aplicación.

1

Para crear la aplicación de inicio rápido, instale el siguiente software en su entorno de desarrollo:

Requisito previo
notas

Descargue la última versión LTS o la última versión de lanzamiento.

Instalar globalmente ejecutando npm install -g @angular/cli en tu terminal.

Editor de código

Utilice el editor de su elección.

Aplicación de terminal y shell

Para usuarios de macOS, usen Terminal o una aplicación similar. Para usuarios de Windows, usen PowerShell.

2

MongoDB Atlas es un servicio de base de datos en la nube totalmente administrado que aloja sus implementaciones de MongoDB. Si no tiene una implementación de MongoDB, puede crear un clúster de MongoDB gratis completando el tutorial de introducción a MongoDB. Este tutorial también muestra cómo cargar conjuntos de datos de muestra en su clúster, incluyendo la sample_restaurants base de datos utilizada en este tutorial.

Para conectarte a tu clúster de MongoDB, debes usar un URI de conexión. Para saber cómo recuperar tu URI de conexión, consulta la sección Agrega tu cadena de conexión del tutorial Primeros pasos de MongoDB.

Importante

Guarde su cadena de conexión en una ubicación segura.

3

Ejecute los siguientes comandos en su terminal para crear un directorio para su proyecto llamado angular-quickstart:

mkdir angular-quickstart
cd angular-quickstart

Luego, ejecute los siguientes comandos desde el directorio angular-quickstart para crear una carpeta para el back end llamada server e inicializar el archivo package.json:

mkdir server
cd server
npm init -y
4

Navegue al package.json archivo en el angular-quickstart/server directorio. Para usar módulos ECMAScript, el formato estándar para empaquetar código JavaScript y reutilizarlo, reemplace la línea que especifica el "type" campo por la siguiente:

"type": "module",
5

Ejecute el siguiente comando para instalar las dependencias mongodb, express, cors y dotenv:

npm install mongodb express cors dotenv

Este comando instala MongoDB, el marco web Express, el paquete cors Node.js para compartir recursos entre orígenes y Dotenv para cargar variables de entorno.

A continuación, ejecute el siguiente comando para instalar TypeScript y las definiciones de tipo requeridas:

npm install -D typescript @types/node @types/cors @types/express tsx

Este comando instala TypeScript, definiciones de tipos para Node.js y Express, y tsx, una herramienta para ejecutar archivos TypeScript directamente.

Después de configurar la estructura y las dependencias del proyecto, siga los pasos de esta sección para configurar su servidor web y conectarse a MongoDB.

1

Crea un archivo llamado server.ts en tu directorio angular-quickstart/server y pega el siguiente código:

inicio rápido angular/servidor/servidor.ts
import express from "express";
import cors from "cors";
import restaurants from "./routes/restaurant.js";
const PORT = process.env.PORT || 5050;
const app = express();
app.use(cors());
app.use(express.json());
app.use("/restaurant", restaurants);
// start the Express server
app.listen(PORT, () => {
console.log(`Server listening on port ${PORT}`);
});
2

En el directorio server, cree un archivo .env y pegue el siguiente código:

MONGODB_URI=<connection string>
PORT=5050

Reemplace el <connection string> marcador de posición con la cadena de conexión que guardó en un paso anterior.

3

En el directorio server, cree un subdirectorio llamado db. Añada un nuevo archivo llamado connection.ts a este subdirectorio y pegue el siguiente código:

inicio rápido angular/servidor/db/conexión.ts
import "dotenv/config";
import { MongoClient, Db } from "mongodb";
const uri = process.env.MONGODB_URI || "";
const client = new MongoClient(uri);
try {
// Connects the client to the server
await client.connect();
// Sends a ping to confirm a successful connection
await client.db("admin").command({ ping: 1 });
console.log(
"Pinged your deployment. You successfully connected to MongoDB!"
);
} catch(err) {
console.error(err);
}
const db: Db = client.db("sample_restaurants");
export default db;

Este archivo se conecta a su implementación de MongoDB, accede a la base de datos sample_restaurants y prueba la conexión a la base de datos.

4

En el directorio server, cree un subdirectorio llamado routes. Cree un archivo llamado restaurant.ts en este subdirectorio y pegue el siguiente código:

inicio rápido angular/servidor/rutas/restaurante.ts
import express, { Request, Response } from "express";
import db from "../db/connection.js";
// Creates an instance of the Express router, used to define our routes
const router = express.Router();
// Gets a list of all the restaurants
router.get("/", async (req: Request, res: Response) => {
let collection = db.collection("restaurants");
let results = await collection.find({}).toArray();
res.send(results).status(200);
});
// Lists restaurants that match the query filter
router.get("/browse", async (req: Request, res: Response) => {
try {
let collection = db.collection("restaurants");
let query = {
borough: "Queens",
name: { $regex: "Moon", $options: "i" },
};
let results = await collection.find(query).toArray();
res.send(results).status(200);
} catch (err) {
console.error(err);
res.status(500).send("Error browsing restaurants");
}
});
export default router;

Este archivo accede a la colección restaurants en la base de datos sample_restaurants y define los siguientes puntos finales GET:

  • /:Recupera todos los restaurantes de la colección de muestras

  • /browse:Recupera restaurantes que coinciden con los criterios de consulta, que filtra los restaurantes en Queens que contienen la palabra "Moon" en el nombre.

Después de configurar el back-end de la aplicación, siga los pasos de esta sección para configurar Angular y agregar los componentes del front-end.

1

Navegue al directorio angular-quickstart y ejecute el siguiente comando para crear una nueva aplicación Angular:

ng new client

Este comando le solicita que responda a una serie de preguntas de configuración. Para cada pregunta, elija las siguientes respuestas:

  • ¿Qué sistema de hojas de estilo te gustaría usar? Selecciona Tailwind CSS.

  • ¿Desea habilitar la representación del lado del servidor (SSR) y la generación de sitios estáticos (SSG/Prerenderización)? Ingrese N

  • ¿Qué herramientas de IA quieres configurar con las mejores prácticas de Angular? Selecciona las herramientas que prefieras.

Tras ejecutar el comando, su proyecto tendrá un directorio client que contiene el andamiaje frontend. El comando también configura su proyecto para usar TailwindCSS, un framework para el formato de interfaz de usuario.

2

Ejecute los siguientes comandos desde el directorio raíz de su proyecto para instalar Zone.js:

cd client
npm install zone.js

Su aplicación utiliza la biblioteca Zone.js para rastrear cambios y actualizar automáticamente la interfaz de usuario.

3

Desde el directorio client, ejecute el siguiente comando para generar un servicio que maneje las llamadas API a su back end:

ng generate service restaurant

Navegue hasta el archivo client/src/app/restaurant.ts y reemplace el contenido con el siguiente código:

angular-quickstart/cliente/src/app/restaurant.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
export interface Restaurant {
_id: string;
name: string;
borough: string;
cuisine: string;
}
@Injectable({
providedIn: 'root'
})
export class RestaurantService {
private apiUrl = 'http://localhost:5050/restaurant';
constructor(private http: HttpClient) {}
getAllRestaurants(): Observable<Restaurant[]> {
return this.http.get<Restaurant[]>(this.apiUrl);
}
getFilteredRestaurants(): Observable<Restaurant[]> {
return this.http.get<Restaurant[]>(`${this.apiUrl}/browse`);
}
}

Este servicio define métodos para obtener datos de restaurantes desde su API Express.

4

Navegue hasta el archivo client/src/app/app.routes.ts y reemplace el contenido con el siguiente código:

inicio rápido angular/cliente/src/app/app.routes.ts
import { Routes } from '@angular/router';
import { RestaurantListComponent } from './restaurant-list/restaurant-list';
export const routes: Routes = [
{ path: '', component: RestaurantListComponent },
{ path: 'browse', component: RestaurantListComponent }
];

Este archivo configura el enrutamiento del lado del cliente y define las siguientes rutas:

  • /: Muestra todos los restaurantes desde el punto final de la API /restaurant/

  • /browse: Muestra los restaurantes filtrados desde el punto final de la API /restaurant/browse

5

Navegue hasta el archivo client/src/app/app.config.ts y reemplace el contenido con el siguiente código:

inicio rápido angular/cliente/src/app/app.config.ts
import { ApplicationConfig, provideZoneChangeDetection } from '@angular/core';
import { provideRouter } from '@angular/router';
import { provideHttpClient } from '@angular/common/http';
import { routes } from './app.routes';
export const appConfig: ApplicationConfig = {
providers: [
provideZoneChangeDetection({ eventCoalescing: true }),
provideRouter(routes),
provideHttpClient()
]
};

Esta configuración habilita la funcionalidad del cliente HTTP para realizar solicitudes API.

6

Ejecute el siguiente comando desde el directorio client para generar un componente para mostrar restaurantes:

ng generate component restaurant-list

Navegue hasta el archivo client/src/app/restaurant-list/restaurant-list.ts y reemplace el contenido con el siguiente código:

angular-quickstart/cliente/src/app/lista-de-restaurantes/lista-de-restaurantes.ts
import { Component, OnInit } from '@angular/core';
import { CommonModule } from '@angular/common';
import { Router } from '@angular/router';
import { RestaurantService, Restaurant } from '../restaurant';
@Component({
selector: 'app-restaurant-list',
standalone: true,
imports: [CommonModule],
templateUrl: './restaurant-list.html',
styleUrl: './restaurant-list.css'
})
export class RestaurantListComponent implements OnInit {
restaurants: Restaurant[] = [];
loading = true;
error = '';
constructor(
private restaurantService: RestaurantService,
public router: Router
) {}
ngOnInit(): void {
this.loadRestaurants();
}
loadRestaurants(): void {
const isFiltered = this.router.url === '/browse';
const observable = isFiltered
? this.restaurantService.getFilteredRestaurants()
: this.restaurantService.getAllRestaurants();
observable.subscribe({
next: (data) => {
this.restaurants = data;
this.loading = false;
},
error: (err) => {
this.error = 'Failed to load restaurants';
this.loading = false;
console.error('Error loading restaurants:', err);
}
});
}
}

Luego, navegue hasta el archivo client/src/app/restaurant-list/restaurant-list.html y reemplace el contenido con el siguiente código:

angular-quickstart/cliente/src/app/lista-de-restaurantes/lista-de-restaurantes.html
<div *ngIf="loading" class="text-center py-8">
<p class="text-gray-600">Loading restaurants...</p>
</div>
<div *ngIf="error" class="bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded">
{{ error }}
</div>
<div *ngIf="!loading && !error">
<h3 class="text-lg font-semibold p-4">
{{ router.url === '/browse' ? 'Filtered Restaurants (Queens, containing "Moon")' : 'All Restaurants' }}
</h3>
<div class="border rounded-lg overflow-hidden">
<div class="relative w-full overflow-auto">
<table class="w-full caption-bottom text-sm">
<thead class="[&_tr]:border-b">
<tr class="border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted">
<th class="h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0">
Name
</th>
<th class="h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0">
Borough
</th>
<th class="h-12 px-4 text-left align-middle font-medium text-muted-foreground [&:has([role=checkbox])]:pr-0">
Cuisine
</th>
</tr>
</thead>
<tbody class="[&_tr:last-child]:border-0">
@for (restaurant of restaurants; track restaurant._id) {
<tr class="border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted">
<td class="p-4 align-middle [&:has([role=checkbox])]:pr-0">
{{ restaurant.name }}
</td>
<td class="p-4 align-middle [&:has([role=checkbox])]:pr-0">
{{ restaurant.borough }}
</td>
<td class="p-4 align-middle [&:has([role=checkbox])]:pr-0">
{{ restaurant.cuisine }}
</td>
</tr>
}
</tbody>
</table>
</div>
</div>
</div>

Este componente recupera y muestra la información del restaurante según la ruta actual.

7

Navegue hasta el archivo client/src/app/app.ts y reemplace el contenido con el siguiente código:

inicio rápido angular/cliente/src/app/app.ts
import { Component } from '@angular/core';
import { RouterOutlet, RouterLink, RouterLinkActive } from '@angular/router';
@Component({
selector: 'app-root',
standalone: true,
imports: [RouterOutlet, RouterLink, RouterLinkActive],
templateUrl: './app.html',
styleUrl: './app.css'
})
export class AppComponent {
title = 'Restaurant Browser';
}

Luego, navegue hasta el archivo client/src/app/app.html y reemplace el contenido con el siguiente código:

angular-quickstart/client/src/app/app.html
<div class="w-full p-6">
<nav class="flex justify-between items-center mb-6">
<a routerLink="/">
<img
alt="MongoDB logo"
class="h-10 inline"
src="https://d3cy9zhslanhfa.cloudfront.net/media/3800C044-6298-4575-A05D5C6B7623EE37/4B45D0EC-3482-4759-82DA37D8EA07D229/webimage-8A27671A-8A53-45DC-89D7BF8537F15A0D.png"
/>
</a>
<div class="flex gap-4">
<a routerLink="/" routerLinkActive="font-bold" [routerLinkActiveOptions]="{exact: true}" class="text-blue-600 hover:underline">
All Restaurants
</a>
<a routerLink="/browse" routerLinkActive="font-bold" class="text-blue-600 hover:underline">
Filtered Restaurants
</a>
</div>
</nav>
<router-outlet></router-outlet>
</div>

Este es el componente principal de la aplicación que incluye la navegación y representa los componentes secundarios apropiados en función de la ruta actual.

8

Navegue hasta el archivo client/src/main.ts y reemplace el contenido con el siguiente código:

inicio rápido angular/cliente/src/main.ts
import 'zone.js';
import { bootstrapApplication } from '@angular/platform-browser';
import { appConfig } from './app/app.config';
import { AppComponent } from './app/app';
bootstrapApplication(AppComponent, appConfig)
.catch((err) => console.error(err));

Este archivo actúa como punto de entrada a su aplicación y aplica y representa su configuración.

Por último, sigue los pasos de esta sección para ejecutar la aplicación y ver los datos del restaurante renderizados.

1

Desde su directorio server, ejecute el siguiente comando para iniciar el servidor:

npx tsx server.ts

Si es exitoso, este comando muestra la siguiente información:

Pinged your deployment. You successfully connected to MongoDB!
Server listening on port 5050
2

En una ventana de terminal aparte, dirígete al directorio client. Ejecuta el siguiente comando para iniciar el frontend de Angular:

ng serve

Si es exitoso, este comando muestra la siguiente información:

Application bundle generation complete.
Watch mode enabled. Watching for file changes...
NOTE: Raw file sizes do not reflect development server per-request transformations.
➜ Local: http://localhost:4200/
➜ press h + enter to show help

Su aplicación Angular realiza solicitudes HTTP desde el puerto 4200 al puerto 5050 para recuperar datos.

3

Abra la URL http://localhost:4200 /. La página de destino inicial muestra una lista de todos los restaurantes de la sample_restaurants.restaurants colección:

La página de destino que muestra todos los restaurantes.

Luego, haga clic en el Filtered Restaurants Enlace en la barra de navegación para ver los restaurantes que coinciden con la consulta de los campos name y borough:

La página web que muestra los restaurantes coincidentes

¡Felicitaciones por completar el tutorial de inicio rápido!

Después de completar estos pasos, tendrá una aplicación web Angular que se conecta a su implementación de MongoDB, ejecuta una consulta en datos de muestra del restaurante y presenta los resultados en un sitio web alojado localmente.

Para obtener más información sobre Angular, MongoDB y la pila MEAN, consulte los siguientes recursos:

Volver

Problemas y Ayuda

En esta página