FirexportGuías
Cómo exportar datos de Firestore a CSV
Firebase console muestra tus datos de Firestore, pero no tiene ningún botón para descargarlos como CSV. Hay tres formas prácticas de sacar un archivo CSV de Firestore. Cuál te conviene depende de cuántos datos tengas y de cuánta configuración quieras hacer.
Actualizado el 24 de septiembre de 2026. Firexport, la extensión del método 1, es nuestra. Los métodos 2 y 3 no la necesitan.
La respuesta corta
- Los resultados de una consulta, ahora mismo: ejecútala en el compilador de consultas (Query builder) de la consola y expórtala con una extensión del navegador. Método 1
- Una exportación repetible, o columnas a tu manera: un script corto con el Admin SDK. Método 2
- Todos los documentos de una colección grande, o ya usas BigQuery: exportación administrada con gcloud y luego BigQuery a CSV. Método 3
| 1. Consola + extensión | 2. Script con Admin SDK | 3. gcloud + BigQuery | |
|---|---|---|---|
| Configuración | Instalar una extensión de Chrome | Node.js y credenciales de Google Cloud | Bucket de Cloud Storage y conjunto de datos de BigQuery |
| Facturación habilitada | No hace falta | No hace falta | Obligatoria (plan Blaze) |
| Exporta | Una consulta del compilador de consultas, con sus filtros, orden y límite | Lo que consulte tu código | Colecciones completas |
| Marcas de tiempo | Como las muestra la consola (ISO 8601 con Advanced) | ISO 8601 | TIMESTAMP de BigQuery |
| Mapas y arreglos | El texto de la consola. Los valores largos pueden quedar cortados con “…” (completos con Advanced) | JSON en una celda | JSON en una celda, tras una consulta de aplanado |
1. Exportar desde Firebase console con Firexport
La página de Firestore en Firebase console tiene un compilador de consultas (Query builder) que ejecuta una consulta y muestra los resultados en una tabla, pero nada con qué descargarlos. Firexport es una extensión gratuita de Chrome que agrega un botón Exportar junto a esos resultados.
- Instala Firexport desde Chrome Web Store.
- En Firebase console, abre Firestore Database y cambia de vista de panel (Panel view) a compilador de consultas (Query builder) (arriba a la derecha de la pestaña Datos).
- Elige la colección en Alcance de la consulta (Query scope) y Ruta (Path), agrega filtros o un límite si quieres, y haz clic en Ejecutar (Run).
- Haz clic en Exportar encima de los resultados. Firexport recorre todas las páginas de resultados y descarga un solo archivo CSV. Para JSON, abre el menú ⋮ junto al botón y elige Exportar a JSON.

Lo que acaba en el archivo:
- Una columna Document ID y luego una columna por campo, tal como las muestra la tabla de la consola.
- Los valores tal como los muestra la consola. En la versión gratuita, las marcas de tiempo van en el formato de la consola (el idioma y la zona horaria de tu navegador), las referencias se acortan y los mapas o arreglos largos pueden quedar cortados con “…”.
- Firexport Advanced, una licencia de pago único, restaura marcas de tiempo ISO 8601, rutas de referencia completas, geopuntos y mapas y arreglos sin truncar a partir de los datos que la consola ya cargó.
No hay que configurar ninguna clave de cuenta de servicio ni facturación: funciona en la sesión de la consola en la que ya iniciaste sesión, y el archivo se crea en tu navegador. Exporta una consulta a la vez, así que una subcolección solo se incluye si la consultas como grupo de colecciones. Funciona en Chrome y otros navegadores basados en Chromium.
Exporta tu próxima consulta de Firestore desde la consola, sin scripts ni claves de cuenta de servicio.
2. Exportar con un script del Admin SDK
Si prefieres no usar una extensión, o la exportación tiene que ejecutarse de forma programada, un script corto de Node.js con el Firebase Admin SDK hace el trabajo. Necesita una cuenta que pueda leer Firestore: un Propietario o Editor del proyecto, o el rol Visualizador de Cloud Datastore.
- Instala el SDK:
npm install firebase-admin - Inicia sesión para obtener credenciales locales:
gcloud auth application-default login. En un servidor, apuntaGOOGLE_APPLICATION_CREDENTIALSa una clave de cuenta de servicio. - Guarda el script de abajo como
export-to-csv.mjs, reemplazayour-project-idy ejecutanode export-to-csv.mjs users.
// Usage: node export-to-csv.mjs users → writes users.csv
import { writeFileSync } from 'node:fs';
import { initializeApp } from 'firebase-admin/app';
import {
getFirestore,
FieldPath,
Timestamp,
GeoPoint,
DocumentReference,
} from 'firebase-admin/firestore';
initializeApp({ projectId: 'your-project-id' });
const db = getFirestore();
const collection = process.argv[2];
if (!collection) throw new Error('Usage: node export-to-csv.mjs <collection>');
// Read the collection 1,000 documents at a time, so large collections don't time out.
const docs = [];
let last;
while (true) {
let query = db.collection(collection).orderBy(FieldPath.documentId()).limit(1000);
if (last) query = query.startAfter(last);
const page = await query.get();
if (page.empty) break;
docs.push(...page.docs);
last = page.docs[page.docs.length - 1];
}
// Firestore types become plain values: timestamps as ISO 8601, references as paths.
function plain(value) {
if (value instanceof Timestamp) return value.toDate().toISOString();
if (value instanceof DocumentReference) return value.path;
if (value instanceof GeoPoint) return { latitude: value.latitude, longitude: value.longitude };
if (value instanceof Uint8Array) return Buffer.from(value).toString('base64');
if (Array.isArray(value)) return value.map(plain);
if (value && typeof value === 'object') {
return Object.fromEntries(Object.entries(value).map(([key, v]) => [key, plain(v)]));
}
return value;
}
// Maps and arrays go in one cell as JSON. Quote any cell with a comma, a quote or a line break.
function cell(value) {
if (value === null || value === undefined) return '';
const text = typeof value === 'object' ? JSON.stringify(value) : String(value);
return /[",\r\n]/.test(text) ? `"${text.replaceAll('"', '""')}"` : text;
}
const rows = docs.map((doc) => ({ documentId: doc.id, ...plain(doc.data()) }));
// Documents in one collection can have different fields, so the columns are all of them.
const columns = [...new Set(rows.flatMap((row) => Object.keys(row)))];
const lines = [columns, ...rows.map((row) => columns.map((column) => row[column]))];
writeFileSync(`${collection}.csv`, lines.map((line) => line.map(cell).join(',')).join('\r\n'));
console.log(`Wrote ${rows.length} documents to ${collection}.csv`);- Para exportar una subcolección de todos los documentos padre, cambia
db.collectionpordb.collectionGroup. - El script guarda todas las filas en memoria antes de escribir el archivo. Para millones de documentos, usa el método 3.
3. Exportar con gcloud y BigQuery
La exportación administrada de Firestore escribe una copia de seguridad en Cloud Storage en el formato propio de Firestore, no en CSV. BigQuery puede cargar ese formato y escribir CSV. Es la vía para colecciones grandes, pero necesita la facturación habilitada (el plan Blaze) y permiso para ejecutar exportaciones y escribir en el bucket. La documentación de exportación e importación de Google lista los roles.
# 1. Export one collection. BigQuery only loads exports made with --collection-ids.
gcloud firestore export gs://YOUR_BUCKET/users-export --collection-ids=users
# 2. Load it into a BigQuery dataset in the same location as the bucket.
bq --location=US mk --dataset firestore_export
bq load --source_format=DATASTORE_BACKUP firestore_export.users \
gs://YOUR_BUCKET/users-export/all_namespaces/kind_users/all_namespaces_kind_users.export_metadataBigQuery no puede escribir columnas anidadas en CSV, y toda tabla cargada desde una exportación de Firestore tiene una: __key__, que contiene el ID del documento. Así que primero haz una copia plana con una consulta, convirtiendo mapas y arreglos en texto JSON, y extrae esa.
# 3. Make a flat copy: maps and arrays become JSON text. List your own fields.
bq query --use_legacy_sql=false --destination_table=firestore_export.users_flat \
'SELECT __key__.name AS documentId, email, createdAt,
TO_JSON_STRING(address) AS address, TO_JSON_STRING(tags) AS tags
FROM firestore_export.users'
# 4. Write it to CSV and download it.
bq extract --destination_format=CSV firestore_export.users_flat gs://YOUR_BUCKET/users.csv
gcloud storage cp gs://YOUR_BUCKET/users.csv .- BigQuery escribe como máximo 1 GB por archivo. Para más, usa un comodín como
gs://YOUR_BUCKET/users-*.csv. - La exportación se factura como una lectura de documento por documento. Borra la carpeta de exportación cuando termines para que deje de ocupar Cloud Storage.
Preguntas frecuentes
¿Puede Firebase console exportar datos de Firestore a CSV?
No. La página de Firestore en Firebase console no tiene botón de descarga. La exportación administrada (la página Importar/Exportar de la consola de Google Cloud, o gcloud firestore export) escribe una copia de seguridad en el formato propio de Firestore en Cloud Storage. Sirve para restaurar datos, no para abrirlos en una hoja de cálculo.
¿Exportar datos de Firestore cuesta dinero?
Todos los métodos leen cada documento exportado al menos una vez, y Firestore los factura como lecturas de documentos. Dentro de la cuota gratuita diaria no cuesta nada. La exportación administrada además necesita la facturación habilitada en el proyecto, y sus archivos ocupan Cloud Storage hasta que los borres.
¿Cómo exporto una subcolección?
Consúltala como grupo de colecciones. En la consola, elige Grupo de colecciones (Collection group) como Alcance de la consulta (Query scope) en el compilador de consultas. En un script, usa db.collectionGroup() en lugar de db.collection(). Con gcloud, pasa el ID de la subcolección a --collection-ids.
¿Puedo exportar a JSON en su lugar?
Sí. El menú Exportar de Firexport tiene Exportar a JSON. Un script puede escribir JSON.stringify(rows) en lugar de CSV. Desde BigQuery, bq extract --destination_format=NEWLINE_DELIMITED_JSON mantiene los mapas y arreglos anidados.
