MongoDB 导入导出
1. 实验介绍
1.1 实验内容
在本节内容中,我们将学习 MongoDB 的一些用于备份的实用工具。
1.2 实验知识点
- 导入
- 导出
- 备份
- 恢复
2. 导入导出
首先,我们将介绍两个用于 MongoDB 的使用工具:
- mongoexport :导出
- mongoimport :导入
2.1 导出
- mongoexport 用于将 MongoDB 数据库中的数据导出为 JSON 或者 CSV 格式
我们以上一节基本操作中的 users 集合为例,首先,我们向其中插入几条数据:
> db.users.insertMany([{name: "Aiden", age: 30, email: "[email protected]", addr: ["CD", "SH"]}, {name: "Tom", age: 20, email: "[email protected]", addr: ["BJ", "SH"]}, {name: "Jim", age: 20, email: "[email protected]", addr: ["BJ", "SH"]}, {name: "Cat", age: 10, addr: ["SZ", "CD"]}])
输出结果如下:
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("5a17e091bb4310a50c2010f3"),
ObjectId("5a17e091bb4310a50c2010f4"),
ObjectId("5a17e091bb4310a50c2010f5"),
ObjectId("5a17e091bb4310a50c2010f6")
]
}
我们来查看集合中的文档:
> db.users.find()
输出结果如下:
{ "_id" : ObjectId("5a17e091bb4310a50c2010f3"), "name" : "Aiden", "age" : 30, "email" : "[email protected]", "addr" : [ "CD", "SH" ] }
{ "_id" : ObjectId("5a17e091bb4310a50c2010f4"), "name" : "Tom", "age" : 20, "email" : "[email protected]", "addr" : [ "BJ", "SH" ] }
{ "_id" : ObjectId("5a17e091bb4310a50c2010f5"), "name" : "Jim", "age" : 20, "email" : "[email protected]", "addr" : [ "BJ", "SH" ] }
{ "_id" : ObjectId("5a17e091bb4310a50c2010f6"), "name" : "Cat", "age" : 10, "addr" : [ "SZ", "CD" ] }
可以看到已经将数据插入进去了。
下面我们来使用 mongoexport 命令导出 users 集合中的数据,保存为 users.json :
$ mongoexport --db shiyanlou001 --collection users --out users.json
--db 选项是指定数据库的名称,我们这里为 shiyanlou001
--collection 是指定集合的名称,我们这里为 users
--out 是指定导出的文件的文件名,我们这里为 users.json
输出结果如下:
2017-11-24T17:27:17.989+0800 connected to: localhost
2017-11-24T17:27:17.989+0800 exported 4 records
左边的一列是导出的时间。
右边的一列中第一行是显示我们连接的 MongoDB 的服务器地址。第二行是导出的文档数为 4 条。
查看 users.json 中的数据,可以发现里面保存了 users 集合中的所有文档。
$ cat users.json
{"_id":{"$oid":"5a17e091bb4310a50c2010f3"},"name":"Aiden","age":30.0,"email":"[email protected]","addr":["CD","SH"]}
{"_id":{"$oid":"5a17e091bb4310a50c2010f4"},"name":"Tom","age":20.0,"email":"[email protected]","addr":["BJ","SH"]}
{"_id":{"$oid":"5a17e091bb4310a50c2010f5"},"name":"Jim","age":20.0,"email":"[email protected]","addr":["BJ","SH"]}
{"_id":{"$oid":"5a17e091bb4310a50c2010f6"},"name":"Cat","age":10.0,"addr":["SZ","CD"]}
从上面的查看结果中可以发现原来的 ObjectId 显示成了 $oid ,这是为什么?
BSON 是 MongoDB 支持的数据类型,而 JSON 支持的内容仅仅是 BSON 的一个子集而已。因此,对于一些只在 BSON 中的数据类型,只有 MongoDB 能够解析。
MongoDB 对导出的 JSON 格式有一些扩展内容,详细的内容可以参考官方文档MongoDB JSON Extended
下面我们介绍 mongoexport 中的一些常用的命令行参数:
- --db
指定数据库名。 - --collection
指定集合名。 - --type
指定文件类型为 csv 或者 json。默认为 json 。 - --out
指定导出的文件名。如果没有指定,将输出到 stdout 。 - --pretty 对于 json 类型而言,将输出一个更直观清晰的格式。
- --limit
指定导出的文档数目。 - --sort
指定导出结果的排序。比如:--sort '{"age":1}' 表示对 age 字段的值升序排列,如果想降序排列,可以把冒号后面改为 -1 。 - --query
提供一个 json 文档作为匹配条件,限制返回的结果集。
2.2 导入
与 mongoexport 对应的即为 mongoimport。用于导入由 mongoexport 创建的 json 和 csv 的内容。
因此,对于 mongoimport 来说,常见的参数与 mongoexport 类似。我们这里是从文件导入到 MongDB 的数据库中,而 mongoimport 的 --db 和 --collection 指的是导入的地方,所以会用到两个 mongoexport 中不存在的参数:
- --file 指定将要导入的文件的文件名。未指定时,从标准输入导入。
- --drop 在导入时,指定的集合存在时,使用该选项,将删除原来的内容
例如,我们导入之前导入的 users.json 文件:
$ mongoimport --db shiyanlou001 --collection users --file users.json --drop
2017-11-27T10:22:35.207+0800 connected to: localhost
2017-11-27T10:22:35.207+0800 dropping: shiyanlou001.users
2017-11-27T10:22:35.380+0800 imported 4 documents
MongoDB 数据导出导入操作视频:
3. 备份和恢复
在前面的内容中,我们说过,JSON 支持的内容仅仅是 BSON 的一个子集而已。虽然 MongoDB 有对应的扩展,但是对于数据的备份,使用导入导出工具进行备份也是不合理的。在 MongoDB 中,有专门的备份工具。在接下来的内容中,我们将介绍他们。
3.1 备份
mongodump 能够把导出的数据库中的内容保存为一个二进制文件。不同于导入导出,这里针对的是数据库。你也可以通过配置项选择集合进行备份。
mongodump 仅备份数据库中的文档,不包含索引( MongoDB 中默认索引为 _id )数据,并且本地数据库 local 不会被备份。
我们可以直接使用 mongodump 进行备份操作:
$ mongodump
输出结果如下:
2017-11-27T10:45:00.904+0800 writing admin.system.version to
2017-11-27T10:45:00.905+0800 done dumping admin.system.version (1 document)
2017-11-27T10:45:00.905+0800 writing shiyanlou001.users to
2017-11-27T10:45:00.909+0800 done dumping shiyanlou001.users (4 documents)
查看 dump 的目录结构:
$ tree dump
dump
|--- admin
| |--- system.version.bson
| |--- system.version.metadata.json
|
|--- shiyanlou001
|--- users.bson
|--- users.metadata.json
2 directories, 4 files
如上所示,并未备份 local 数据库(即本地数据库)中的内容,默认的 IP 是 localhost 和 PORT 是 27017,默认输出为当前目录下的 dump 目录 。
下面简单列举一些常见的参数:
--host
<:port>, -h <:port> 默认值: localhost:27017
--port
默认值: 27017
--username
, -u 指定用户名,需要与 --password and --authenticationDatabase 配置项一起使用
--db
, -d 指定数据库进行备份。未指定时会备份除本地数据库的所有数据库。
--collection
, -c 指定集合进行备份,未指定针对指定数据库中的所有集合
--out
, -o 指定保存目录。默认值为 dump
--archive
将备份内容写入到一个存档文件中,该选项可以用来代替 --out 选项,但不能在 --out 选项中使用 --archive 选项
3.2 恢复
mongorestore 可以从 mongodump 创建的备份中读取内容。对于服务器中存在的内容,mongorestore 不会覆盖原有的内容,如果数据库中集合的文档与要恢复的的文档有相同的值,原有文档不会被覆盖。
该参数是mongorestore 的最后一个参数,指定要从恢复的备份内容的位置 - --archive
从归档文件中恢复 - --dir 与
功能相同,两者不能同时使用
如下示例,恢复备份中的内容:
$ mongorestore --dir dump
输出结果如下:
2017-11-27T13:09:50.431+0800 preparing collections to restore from
2017-11-27T13:09:50.639+0800 reading metadata for shiyanlou001.users from dump/shiyanlou001/users.metadata.json
2017-11-27T13:09:50.746+0800 restoring shiyanlou001.users from dump/shiyanlou001/users.bson
2017-11-27T13:09:50.916+0800 error: multiple errors in bulk operation:
- E11000 duplicate key error collection: shiyanlou001.users index: id dup key: { : ObjectId('5a17e091bb4310a50c2010f4') }
- E11000 duplicate key error collection: shiyanlou001.users index: id dup key: { : ObjectId('5a17e091bb4310a50c2010f5') }
- E11000 duplicate key error collection: shiyanlou001.users index: id dup key: { : ObjectId('5a17e091bb4310a50c2010f6') }
- E11000 duplicate key error collection: shiyanlou001.users index: id dup key: { : ObjectId('5a17e091bb4310a50c2010f3') }
2017-11-27T13:09:50.917+0800 no indexes to restore
2017-11-27T13:09:50.917+0800 finished restoring shiyanlou001.users (4 documents)
2017-11-27T13:09:50.917+0800 done
done 表示恢复完成,可以从上述的日志中发现哪些数据没有被恢复。
MongoDB 备份与恢复操作视频:
4. 总结
本节实验主要学习了如下内容:
- 集合的导入导出
- 数据库的备份和恢复