Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Integra 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 en 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 gestiona tanto la lógica del cliente como la del servidor con herramientas de compilación integradas

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

Meteor está construido sobre el modelo orientado a documentos de MongoDB y las aplicaciones de Meteor configuran MongoDB por defecto. Puedes crear rápidamente una aplicación full-stack que almacene datos en MongoDB con instalaciones mínimas de dependencias o código estándar.

La estructura flexible de documentos de MongoDB se alinea naturalmente con los objetos de JavaScript. Como resultado, puedes trabajar sin problemas con los datos de MongoDB en tus componentes Vue. Cuando utilizas Meteor para query MongoDB, los documentos que recibes pueden ser utilizados directamente en tus plantillas Vue sin necesidad de una transformación de datos compleja.

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 de Atlas y configurar los directorios de la aplicación.

1

Para crear la aplicación Quick Start, instala el siguiente software en tu entorno de desarrollo:

Requisito previo
notas

Utiliza la versión 20 o posterior.

Editor de código

Este tutorial utiliza Visual Studio Code, pero puede utilizar el editor de su preferencia.

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 completamente gestionado que aloja tus implementaciones de MongoDB. Si no tienes una implementación de MongoDB, puedes crear un clúster de MongoDB de forma gratuita (no se requiere tarjeta de crédito) completando el tutorial Introducción a MongoDB. El tutorial Get Started de MongoDB también demuestra cómo cargar conjuntos de datos de muestra en tu clúster, incluido el sample_restaurants base de datos que se emplea 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

Guarda tu 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

Instala el controlador de Node.js ejecutando el siguiente comando en tu terminal:

npm install mongodb

Para obtener más información sobre cómo instalar el driver, consulta la guía Empieza a utilizar el driver de 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

El tender --vue crea un proyecto Meteor configurado con Vue 3, Vite y Tailwind CSS para el estilo.

6

Antes de agregar código de aplicación, remueve los archivos de plantilla innecesarios ejecutando los siguientes comandos desde tu 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, sigue los pasos de esta sección para conectar tu aplicación Meteor con MongoDB.

1

Recupera el URI de conexión que guardaste en un paso anterior.

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

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

Luego, establece la variable de entorno MONGO_URL a este URI de conexión modificado 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:

imports/api/restaurantsPublications.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:

  • restaurantsPublica todos los restaurantes, pero los limita a 200 para evitar problemas de rendimiento.

  • restaurants.filtered: publica restaurantes en Queens que tienen "Moon" en el nombre. El argumento $options especifica que esta coincidencia de string regex 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"

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

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.

Una vez configurada la capa de datos, sigue los pasos de esta sección para crear componentes de Vue que muestren los datos del restaurante.

1

Navega al archivo imports/ui/router.js y pega 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:

imports/ui/components/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 la información individual de restaurantes 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:

imports/ui/views/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 gestiona la visualización de la lista de restaurantes y cambia automáticamente entre mostrar todos los restaurantes o los 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

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

La página de inicio que muestra todos los restaurantes

En la parte superior de la página, haz clic en el Browse Filtered botón para ver restaurantes en Queens que tengan "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.

Abre una segunda ventana de terminal y navega hasta tu directorio de proyecto. Exporta tu URI de conexión de MongoDB ejecutando el mismo comando que se muestra en un 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.

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

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

Para aprender más sobre Meteor, Vue y MongoDB, consulta los siguientes recursos:

Volver

Integración de React

En esta página