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.
 avatar
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