Nodejs 导出mongodb且以当前时间命名导出文件

Nodejs 导出mongodb且以当前时间命名导出文件

mongoexport -d test -c users -o mongo_$(date+%F).json

导出后为啥我的文件名直接就叫做mongo_$(date+%F).json了?说好的当前时间呢?说好的幸福呢?

2 回复

要实现使用 Node.js 导出 MongoDB 数据并将文件以当前时间命名,我们需要使用 Node.js 的一些内置库以及 MongoDB 的官方驱动程序。以下是具体步骤和示例代码。

步骤

  1. 安装必要的库

    • mongodb:用于连接和操作 MongoDB。
    • moment:用于格式化日期(可选)。
  2. 编写脚本

    • 连接到 MongoDB。
    • 执行导出操作。
    • 将文件以当前时间命名并保存到指定目录。

示例代码

const { MongoClient } = require('mongodb');
const moment = require('moment'); // 如果需要更复杂的日期格式,可以使用 moment

// 连接字符串和数据库名称
const uri = "mongodb://localhost:27017";
const dbName = "test";

// 定义导出的集合和输出文件路径
const collectionName = 'users';
const outputDirectory = './exports/';

// 获取当前时间并格式化为 YYYY-MM-DD
const now = moment().format('YYYY-MM-DD');

// 构建输出文件路径
const outputFilePath = `${outputDirectory}mongo_${now}.json`;

async function exportData() {
    try {
        // 连接到 MongoDB
        const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });
        
        await client.connect();
        console.log("Connected to MongoDB");

        const db = client.db(dbName);
        const collection = db.collection(collectionName);

        // 导出数据
        const data = await collection.find({}).toArray();

        // 将数据写入文件
        require('fs').writeFileSync(outputFilePath, JSON.stringify(data, null, 2));
        console.log(`Data exported to ${outputFilePath}`);

        // 关闭连接
        client.close();
    } catch (error) {
        console.error("Error exporting data:", error);
    }
}

exportData();

解释

  • 连接 MongoDB:我们使用 MongoClient 连接到本地 MongoDB 实例。
  • 获取当前时间:使用 moment 库格式化当前时间(你可以选择使用原生 JavaScript 的 Date 对象)。
  • 构建文件路径:将文件路径构建为 ./exports/mongo_YYYY-MM-DD.json
  • 导出数据:查询集合中的所有文档,并将其转换为 JSON 字符串。
  • 写入文件:使用 fs.writeFileSync 将数据写入指定文件路径。

注意事项

  • 确保 MongoDB 服务正在运行。
  • 根据实际情况调整 MongoDB 的连接 URI 和数据库名称。
  • 如果不需要复杂的日期格式,可以直接使用 new Date().toISOString() 替换 moment

这样,你就可以使用 Node.js 脚本定期导出 MongoDB 数据,并将文件以当前时间命名。


根据你的描述,你在尝试使用 mongoexport 命令行工具来导出 MongoDB 数据,并希望文件名包含当前时间。但是,命令中的变量没有正确解析。

如果你希望通过 Node.js 实现这一点,可以使用 mongodbfs 模块来实现。以下是一个简单的示例代码:

const { MongoClient } = require('mongodb');
const fs = require('fs');
const path = require('path');

async function exportCollection() {
    const client = new MongoClient('mongodb://localhost:27017', { useNewUrlParser: true, useUnifiedTopology: true });
    try {
        await client.connect();
        const db = client.db('test');
        const collection = db.collection('users');

        const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
        const filename = `mongo_${timestamp}.json`;
        const filePath = path.join(__dirname, filename);

        const data = await collection.find({}).toArray();

        fs.writeFileSync(filePath, JSON.stringify(data, null, 2));
        console.log(`Data exported to ${filePath}`);
    } catch (err) {
        console.error(err);
    } finally {
        await client.close();
    }
}

exportCollection();

解释:

  1. MongoDB 连接:使用 MongoClient 连接到本地 MongoDB 服务器。
  2. 生成文件名:使用 new Date().toISOString() 获取当前时间,并替换掉冒号和点,以避免文件名中出现非法字符。
  3. 读取数据:从 users 集合中读取所有文档。
  4. 写入文件:将数据写入到以当前时间命名的 JSON 文件中。

这样,每次运行脚本时,都会生成一个带有当前时间戳的 JSON 文件,而不仅仅是固定的字符串。

回到顶部