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
8 months ago
4.9 kB
5
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