Exporting Data from FaunaDB to JSON using Node.js
This snippet demonstrates how to export data from FaunaDB to a JSON file using Node.js. It uses 'inquirer' for user input, 'faunadb' to connect to the database, and 'fs' to write the data to a file. The function retrieves collections and documents, then saves them in a structured JSON format.unknown
javascript
a month ago
4.9 kB
2
Indexable
const inquirer = require('inquirer'); const faunadb = require('faunadb'); const { MongoClient } = require('mongodb'); const fs = require('fs'); const path = require('path'); // Initialize FaunaDB client let faunaClient; const q = faunadb.query; // Function to export data from FaunaDB const exportData = async (databaseName) => { try { const collections = await faunaClient.query(q.Paginate(q.Collections())); const data = {}; for (const ref of collections.data) { const collectionName = ref.id; const documents = await faunaClient.query( q.Map( q.Paginate(q.Documents(q.Collection(collectionName))), q.Lambda('X', q.Get(q.Var('X'))) ) ); data[collectionName] = documents.data.map(doc => doc.data); } const exportPath = path.join(__dirname, `${databaseName}_export.json`); fs.writeFileSync(exportPath, JSON.stringify(data, null, 2)); console.log(`Data exported successfully to ${exportPath}`); } catch (error) { console.error('Error exporting data:', error); } }; // Function to migrate data to MongoDB Atlas const importToMongoDB = async (databaseName, mongoUri, mongoDbName) => { try { const mongoClient = new MongoClient(mongoUri, { useNewUrlParser: true, useUnifiedTopology: true }); await mongoClient.connect(); console.log('Connected to MongoDB Atlas'); const mongoDb = mongoClient.db(mongoDbName); const filePath = path.join(__dirname, `${databaseName}_export.json`); const rawData = fs.readFileSync(filePath); const data = JSON.parse(rawData); for (const [collectionName, documents] of Object.entries(data)) { console.log(`Importing collection: ${collectionName}`); const mongoCollection = mongoDb.collection(collectionName); await mongoCollection.insertMany(documents); console.log(`Inserted ${documents.length} documents into ${collectionName}`); } await mongoClient.close(); console.log('Migration to MongoDB Atlas completed successfully'); } catch (error) { console.error('Error during MongoDB import:', error); } }; // Function to guide through the query conversion process const convertQuery = (faunaQuery) => { try { console.log(`Converting FaunaDB query: ${faunaQuery}`); // Basic conversion examples let mongoQuery = faunaQuery .replace(/q.Get\(q.Ref\(q.Collection\("(.+?)"\), "(.+?)"\)\)/g, '{ _id: "$2" }') .replace(/q.Match\(q.Index\("(.+?)"\), "(.+?)"\)/g, '{ "$1": "$2" }') .replace(/q.Paginate\(q.Match\(q.Index\("(.+?)"\)\)\)/g, '{ "$1": { "$exists": true } }') .replace(/q.Create\(q.Collection\("(.+?)"\), \{ data: (.+?) \}\)/g, '{ "$1": $2 }'); console.log(`Converted MongoDB query: ${mongoQuery}`); return mongoQuery; } catch (error) { console.error('Error converting query:', error); return null; } }; // Function to guide through the migration process const migrate = async () => { try { // Step 1: Connect to FaunaDB const { faunaSecret, faunaDomain, faunaScheme, faunaPort } = await inquirer.prompt([ { type: 'input', name: 'faunaSecret', message: 'Enter your FaunaDB secret key:' }, { type: 'input', name: 'faunaDomain', message: 'Enter your FaunaDB domain (e.g., db.fauna.com):', default: 'db.fauna.com' }, { type: 'input', name: 'faunaScheme', message: 'Enter your FaunaDB scheme (http or https):', default: 'https' }, { type: 'number', name: 'faunaPort', message: 'Enter your FaunaDB port (default is 443):', default: 443 } ]); faunaClient = new faunadb.Client({ secret: faunaSecret, domain: faunaDomain, scheme: faunaScheme, port: faunaPort }); // Step 2: Export Data from FaunaDB const { databaseName } = await inquirer.prompt([ { type: 'input', name: 'databaseName', message: 'Enter the name of the FaunaDB database to export:' } ]); console.log('Exporting data from FaunaDB...'); await exportData(databaseName); // Step 3: Connect to MongoDB Atlas const { mongoUri, mongoDbName } = await inquirer.prompt([ { type: 'input', name: 'mongoUri', message: 'Enter your MongoDB Atlas connection string:' }, { type: 'input', name: 'mongoDbName', message: 'Enter your MongoDB database name:' } ]); // Step 4: Import Data to MongoDB Atlas console.log(`Importing data into MongoDB Atlas...`); await importToMongoDB(databaseName, mongoUri, mongoDbName); // Step 5: Query Conversion const { faunaQuery } = await inquirer.prompt([ { type: 'input', name: 'faunaQuery', message: 'Enter a FaunaDB query to convert to MongoDB (optional):' } ]); if (faunaQuery) convertQuery(faunaQuery); console.log('Migration process completed successfully!'); } catch (error) { console.error('Migration process encountered an error:', error); } }; // Run the migration script migrate();
Editor is loading...
Leave a Comment