MongoDB 提供了 mongoexport 命令来导出数据,导出的数据是 json 格式的,当然也可以是 csv 格式。主要可以实现备份和恢复的功能。

具体的使用,我们使用 –help 查看,主要的参数有:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
-h [ --host ] arg         要连接的服务器,例如 127.0.0.1 或者 localhost

--port arg                要连接服务器的端口,也可以使用 --host hostname:port

-u [ --username ] arg     用户名

-p [ --password ] arg     密码

-d [ --db ] arg           使用的数据库(database)名称

-c [ --collection ] arg   使用的集合(collection)

-o [ --out ] arg          导出的文件名

-f [ --fields ] arg       字段名称,使用逗号分隔,例如 -f name,age

-q [ --query ] arg        查询过滤器

--csv                     导出为 csv 格式

例如,我们要导出 tests 数据库中的 users 集合,可以使用:

1
mongoexport -d tests -c users -o users.dat

现在,针对这几个简单的参数,我们自己使用 nodejs 来进行对 mongoexport 简单的实现,大概思路如下:

安装 mongodb:

1
npm install mongodb

连接 MongoDB 的主要代码:

1
2
3
4
5
var mongoClient = new MongoClient(new Server('localhost', 27017));

mongoClient.open(function(err, mongoclient) {

});
    1. 使用 process.argv 来接收输入的参数
    1. 使用 fs.writeFile 来输出 json 数据文件

具体实现如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
var fs = require('fs'),
    MongoClient = require('mongodb').MongoClient,
    Server = require('mongodb').Server,

    options = null;
    mongoClient = null;

if (process.argv.length <= 2 || process.argv.indexOf('--help') !== -1) {
    showHelp();
    return;
}

options = getOptions();
exportFile();

function showHelp() {
    console.error([
        'Export MongoDB data to JSON files.',
        '',
        'options:',
          ' --help                                produce help message',
          ' -h [ --host ] arg                     mongo host to connect to',
          ' --port arg                            server port',
          ' -u [ --username ] arg                 username',
          ' -p [ --password ] arg                 password',
          ' -d [ --db ] arg                       database to use',
          ' -c [ --collection ] arg               collection to use (some commands)',
          ' -o [ --out ] arg                      output file'
    ].join('\n'));
}

function getOptions() {
    var args = process.argv,
        options = {
            host: '127.0.0.1',
            port: 27017
        },
        keys = {
            '-h': 'host',
            '--host': 'host',
            '--port': 'port',
            '-u': 'username',
            '--username': 'username',
            '-p': 'password',
            '--password': 'password',
            '-d': 'db',
            '--db': 'db',
            '-c': 'collection',
            '--collection': 'collection',
            '-o': 'output',
            '--out': 'output'
        };
    for (var i = 2; i < args.length; i += 2) {
        if (keys.hasOwnProperty(args[i])) {
            options[keys[args[i]]] = args[i + 1];
        }
    }
    return options;
}

function exportFile() {
    mongoClient = new MongoClient(new Server(options.host, options.port, {native_parse: true}));
    mongoClient.open(function(err, mongoclient) {
        var db = mongoclient.db(options.db);
        db.collection(options.collection).find().toArray(function(err, results) {
            if (err) {
                console.log(err);
                return;
            }
            fs.writeFile(options.output, JSON.stringify(results), function(err) {
                if (err) {
                    console.log(err);
                    return;
                }
                console.log([
                    'connected to: ' + options.host,
                    'exported ' + results.length + ' records'
                ].join('\n'));
                mongoClient.close();
            });
        });
    });
}

如何使用

1
node mongoexport.js -d tests -c users -o users.dat

源码下载