Docs Menu
Docs Home
/ /

Integrar MongoDB con Meteor y Vue

En esta guía, aprenderá a crear una aplicación Meteor completa que utiliza Vue como framework front-end. Meteor es un framework JavaScript para crear aplicaciones web y móviles. Este framework es compatible con diversas bibliotecas front-end para crear la interfaz de usuario, incluyendo Vue.

La aplicación de este tutorial consta de las siguientes capas:

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

  • Capa de aplicación: Meteor maneja la lógica tanto del lado del cliente como del servidor con herramientas de compilación integradas

  • Capa de presentación: Vue implementa la interfaz de usuario con enlace de datos reactivo

Meteor se basa en el modelo de documentos de MongoDB, y las aplicaciones Meteor configuran MongoDB por defecto. Puedes crear rápidamente una aplicación completa que almacene datos en MongoDB con mínimas instalaciones de dependencias o código repetitivo.

La estructura flexible de documentos de MongoDB se alinea de forma natural con los objetos JavaScript. Como resultado, puede trabajar sin problemas con los datos de MongoDB en sus componentes de Vue. Al usar Meteor para consultar MongoDB, los documentos que recibe pueden usarse directamente en sus plantillas de Vue sin necesidad de una transformación compleja de datos.

Además, Meteor ofrece sincronización de datos en tiempo real integrada que actualiza automáticamente los componentes de Vue cuando los datos cambian en MongoDB. Cuando un usuario modifica datos, todos los usuarios conectados ven los cambios al instante en sus interfaces de Vue, sin necesidad de actualizar ni consultar manualmente. Al usar MongoDB con Meteor y Vue, puede aprovechar las capacidades de sincronización de datos en tiempo real de Meteor junto con el sistema de componentes reactivos de Vue.

Este tutorial muestra cómo crear una aplicación web con Meteor y Vue. 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 Meteor, 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

Utilice la versión 20 o posterior.

Editor de código

Este tutorial utiliza Visual Studio Code, pero puedes usar el editor que prefieras.

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 (sin tarjeta de crédito) 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... sample_restaurants base de datos que se utiliza 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.

Tip

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

3

Instale Meteor ejecutando el siguiente comando en su terminal:

npx meteor

Si encuentras algún problema, consulta la guía de instalación de Meteor.

4

Instale el controlador Node.js ejecutando el siguiente comando en su terminal:

npm install mongodb

Para obtener más información sobre cómo instalar el controlador, consulte la guía Introducción al controlador Node.js.

5

Ejecuta el siguiente comando para crear un nuevo proyecto Meteor con Vue:

meteor create --vue meteor-vue-quickstart
cd meteor-vue-quickstart

La bandera --vue crea un proyecto Meteor configurado con Vue 3, Vite y Tailwind CSS para estilo.

6

Antes de agregar el código de la aplicación, elimine los archivos de plantilla innecesarios ejecutando los siguientes comandos desde su directorio meteor-vue-quickstart:

cd imports/ui
rm components/AppMenu.vue components/Hello.vue components/Info.vue views/About.vue views/Home.vue

Esto remueve los componentes por defecto de la plantilla que la aplicación del restaurante no utiliza.

Después de configurar la estructura del proyecto, siga los pasos de esta sección para conectar su aplicación Meteor a MongoDB.

1

Recupere la URI de conexión que guardó en un paso anterior.

Para acceder a la base de datos sample_restaurants, modifique la URI de conexión para incluir el nombre de la base de datos. Utilice el siguiente formato para actualizar la URI:

mongodb+srv://<username>:<password>@<cluster>/sample_restaurants?<options>

Luego, configure la variable de entorno MONGO_URL en esta URI de conexión modificada ejecutando el siguiente comando desde el directorio meteor-vue-quickstart:

export MONGO_URL="<connection URI>"

Reemplace el marcador de posición <connection URI> con su URI de conexión.

2

En el directorio imports/api, crea un archivo llamado restaurantsCollection.js y pega el siguiente código:

imports/api/restaurantsCollection.js
import { Mongo } from 'meteor/mongo';
export const RestaurantsCollection = new Mongo.Collection('restaurants');

Este archivo accede y exporta la colección sample_restaurants.restaurants.

3

Cree un archivo llamado restaurantsPublications.js en el directorio imports/api y pegue el siguiente código:

importaciones/api/restaurantesPublicaciones.js
import { Meteor } from 'meteor/meteor';
import { RestaurantsCollection } from './restaurantsCollection';
// Publishes all restaurants
Meteor.publish('restaurants', function publishRestaurants() {
console.log('Publishing all restaurants...');
const cursor = RestaurantsCollection.find({}, { limit: 200 }); // Limit for performance
console.log('Publication cursor created for all restaurants');
return cursor;
});
// Publishes restaurants that match the "borough" and "name" filters
Meteor.publish('restaurants.filtered', function publishFilteredRestaurants() {
console.log('Publishing filtered restaurants...');
const query = {
borough: 'Queens',
name: { $regex: 'Moon', $options: 'i' }
};
const cursor = RestaurantsCollection.find(query);
console.log('Publication cursor created for filtered restaurants');
return cursor;
});

Este archivo define las publicaciones de Meteor que permiten al cliente suscribirse a los datos de los restaurantes. Incluye las siguientes publicaciones:

  • restaurants: Publica todos los restaurantes, pero los limita a 200 para evitar problemas de rendimiento

  • restaurants.filteredPublica restaurantes en Queens cuyo nombre tiene "Moon". El argumento $options especifica que esta coincidencia de cadena de expresiones regulares no distingue entre mayúsculas y minúsculas.

4

Cree un nuevo directorio llamado scripts y, a continuación, cree un archivo en este directorio llamado insertDemo.js. Pegue el siguiente código en insertDemo.js:

scripts/insertDemo.js
const { MongoClient } = require('mongodb');
const MONGO_URL = process.env.MONGO_URL;
async function insertSampleRestaurant() {
const client = new MongoClient(MONGO_URL);
try {
await client.connect();
const db = client.db();
const collection = db.collection('restaurants');
const doc = {
name: "Honey Moon Coffee Shop",
borough: "Queens",
cuisine: "Café/Coffee/Tea",
};
const result = await collection.insertOne(doc);
console.log('Inserted restaurant with ID:', result.insertedId);
} catch (error) {
console.error('Error:', error);
} finally {
await client.close();
}
}
insertSampleRestaurant();

Este archivo define un método llamado insertSampleRestaurant(), que inserta un documento que almacena los siguientes campos:

  • name: "Honey Moon Coffee Shop"

  • borough: "Queens"

  • cuisine: "Café/Coffee/Tea"

Utilizará este archivo para demostrar las capacidades de sincronización de datos en tiempo real de Meteor en un paso futuro.

5

Reemplace el contenido de server/main.js con el siguiente código:

server/main.js
import { Meteor } from 'meteor/meteor';
import { RestaurantsCollection } from '../imports/api/restaurantsCollection';
import '../imports/api/restaurantsPublications';
Meteor.startup(async () => {
// Check connection to restaurants collection
try {
const restaurantCount = await RestaurantsCollection.find().countAsync();
console.log(`Connected to MongoDB Atlas. Found ${restaurantCount} restaurants in the collection`);
} catch (error) {
console.error('Error connecting to restaurants collection:', error);
}
});

Este archivo importa las colecciones y publicaciones necesarias. También crea una función de inicio que verifica la conexión a MongoDB imprimiendo el número de documentos en la colección restaurants.

Después de configurar la capa de datos, siga los pasos de esta sección para crear componentes de Vue que muestren los datos del restaurante.

1

Navegue hasta el archivo imports/ui/router.js y pegue el siguiente código:

importaciones/ui/router.js
import { createRouter, createWebHistory } from 'vue-router';
import RestaurantList from './views/RestaurantList.vue';
export const router = createRouter({
history: createWebHistory(),
routes: [
{
path: '/',
name: 'home',
component: RestaurantList,
meta: { filter: false }
},
{
path: '/browse',
name: 'browse',
component: RestaurantList,
meta: { filter: true }
}
],
});

Este archivo configura las rutas de Vue y determina el contenido que se representará en cada una. La ruta / muestra todos los datos del restaurante y la ruta /browse muestra los datos filtrados.

2

En el directorio imports/ui/components, crea un archivo llamado Restaurant.vue que contenga el siguiente código:

importaciones/ui/componentes/Restaurant.vue
<script setup>
defineProps({
restaurant: {
type: Object,
required: true,
},
});
</script>
<template>
<tr class="border-b transition-colors hover:bg-gray-50">
<td class="p-4 align-middle">{{ restaurant.name }}</td>
<td class="p-4 align-middle">{{ restaurant.borough }}</td>
<td class="p-4 align-middle">{{ restaurant.cuisine }}</td>
</tr>
</template>

Este componente muestra información individual del restaurante como una fila en una tabla.

3

En el directorio imports/ui/views, crea un archivo llamado RestaurantList.vue que contenga el siguiente código:

importaciones/ui/vistas/RestaurantList.vue
<script setup>
import Restaurant from '../components/Restaurant.vue';
import { subscribe, autorun } from 'vue-meteor-tracker';
import { RestaurantsCollection } from '../../api/restaurantsCollection';
import { useRoute, RouterLink } from 'vue-router';
import { computed } from 'vue';
const route = useRoute();
// Determines whether to show filtered results
const isFiltered = computed(() => route.path === '/browse');
// Subscribes to both publications to avoid switching issues
subscribe('restaurants');
subscribe('restaurants.filtered');
// Retrieves restaurants based on current route with client-side filtering as backup
const restaurants = autorun(() => {
let docs;
if (isFiltered.value) {
docs = RestaurantsCollection.find({
borough: 'Queens',
name: { $regex: 'Moon', $options: 'i' }
}).fetch();
console.log('Filtered restaurants found:', docs.length);
} else {
docs = RestaurantsCollection.find({}, { limit: 200 }).fetch();
console.log('All restaurants found:', docs.length);
}
return docs;
}).result;
// Determines the title based on the route
const getTitle = computed(() => {
return isFiltered.value
? 'Filtered Restaurants (Queens, containing "Moon")'
: 'All Restaurants';
});
</script>
<template>
<div class="container mx-auto px-4">
<!-- Navigation -->
<nav class="flex justify-between items-center mb-6 p-4 bg-white shadow rounded">
<div class="flex space-x-4">
<RouterLink
to="/"
class="px-4 py-2 text-blue-600 hover:bg-blue-50 rounded transition-colors"
:class="{ 'bg-blue-100 font-semibold': !isFiltered }"
>
All Restaurants
</RouterLink>
<RouterLink
to="/browse"
class="px-4 py-2 text-blue-600 hover:bg-blue-50 rounded transition-colors"
:class="{ 'bg-blue-100 font-semibold': isFiltered }"
>
Browse Filtered
</RouterLink>
</div>
</nav>
<!-- Header -->
<header class="mb-6">
<h1 class="text-4xl font-bold text-gray-800 my-4">Restaurant Directory</h1>
<h3 class="text-lg font-semibold text-gray-600">{{ getTitle }}</h3>
</header>
<!-- Restaurant Table -->
<div class="border rounded-lg overflow-hidden shadow">
<div class="relative w-full overflow-auto">
<table class="w-full text-sm">
<thead class="bg-gray-100 border-b-2 border-gray-300">
<tr class="border-b-2 border-gray-400">
<th class="h-14 px-4 text-left align-middle font-bold text-gray-900 text-base tracking-wide">
Name
</th>
<th class="h-14 px-4 text-left align-middle font-bold text-gray-900 text-base tracking-wide">
Borough
</th>
<th class="h-14 px-4 text-left align-middle font-bold text-gray-900 text-base tracking-wide">
Cuisine
</th>
</tr>
</thead>
<tbody>
<Restaurant
v-for="restaurant in restaurants"
:key="restaurant._id"
:restaurant="restaurant"
/>
</tbody>
</table>
<!-- Empty state -->
<div v-if="restaurants.length === 0" class="p-8 text-center text-gray-500">
<p>No restaurants found. Ensure that your connection URI is correct and includes the sample_restaurants database name.</p>
<p v-if="isFiltered" class="text-sm mt-2">
Try the "All Restaurants" tab to see all available restaurants.
</p>
</div>
</div>
</div>
<!-- Restaurant count -->
<div class="mt-4 text-sm text-gray-600">
Showing {{ restaurants.length }} restaurant{{ restaurants.length !== 1 ? 's' : '' }}
</div>
</div>
</template>

Este componente maneja la visualización de la lista de restaurantes y cambia automáticamente entre mostrar todos los restaurantes o resultados filtrados según la ruta actual.

4

Reemplace el contenido de imports/ui/App.vue con el siguiente código:

importaciones/ui/App.vue
<script setup>
import { RouterView } from 'vue-router';
</script>
<template>
<div class="min-h-screen bg-gray-50">
<RouterView />
</div>
</template>

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.

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

1

Navegue al directorio de su proyecto y ejecute el siguiente comando desde su terminal:

meteor npm run start

Si la operación es exitosa, la salida del comando se asemeja al siguiente ejemplo:

[[[[[ ~/meteor-vue-quickstart ]]]]]
=> Started proxy.
=> Started HMR server.
...
Connected to MongoDB Atlas. Found 25368 restaurants in the collection
=> Started your app.
=> App running at: http://localhost:3000/
2

Abra http://localhost:3000/ en su navegador web. La página de inicio muestra una lista de 200 restaurantes sin filtrar en la sample_restaurants.restaurants colección:

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

En la parte superior de la página, haga clic en el Browse Filtered Botón para ver restaurantes en Queens que tienen "Moon" en su nombre:

La página web que muestra los restaurantes filtrados
3

Puede explorar las funciones de sincronización de datos en tiempo real de Meteor insertando un documento de muestra y viendo los cambios en el frontend de su aplicación.

Abra una segunda ventana de terminal y navegue al directorio de su proyecto. Exporte la URI de conexión de MongoDB ejecutando el mismo comando que se mostró en el paso anterior:

export MONGO_URL="<connection URI>"

Luego, ejecute el siguiente comando para insertar un documento de muestra que tenga un valor name de "Honey Moon Coffee Shop":

node scripts/insertDemo.js

Puede ver el nuevo documento en la Filtered Restaurants tabla en la URL http://localhost:3000/browse.

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

Después de completar estos pasos, tendrá una aplicación web Meteor y Vue que se conecta a su implementación de MongoDB, ejecuta consultas en datos de restaurantes de muestra y presenta los resultados con reactividad en tiempo real.

Para obtener más información sobre Meteor, Vue y MongoDB, consulte los siguientes recursos:

Volver

Integración de React

En esta página